使用空名称取消设置环境变量

使用空名称取消设置环境变量

由于某种原因,我的系统设置了一个没有名称的环境变量。这可以在输出中看到,printenv一行仅包含=和 导致 Python 出现问题(更具体地说os.environ是对象)。

如何取消设置此环境变量?是否还有其他解决方法(例如,首先阻止设置变量)?

要重现例如env -i printenv,或者对于Python问题执行env -i = python -c "import os; os.environ.clear()"

答案1

环境变量不应具有空名称,因此许多实用程序不支持它们。

GNU coreutils 的命令env支持使用空名称设置环境变量,但不支持取消设置。这是一个错误。

$ env '=wibble' env |grep wibble                                 
=wibble
$ env '=wibble' env -u '' env
env: cannot unset `': Invalid argument

普通 shell 也无法取消设置空名称。没关系,因为空名称不应该用作环境变量,也不能用作 shell 变量。 Zsh 是其中唯一有缺陷的一个:它假装完成了这项工作,但实际上什么也没做。

$ env '=wibble' dash -c 'unset ""'
dash: 1: unset: : bad variable name
$ env '=wibble' bash -c 'unset ""'
bash: line 0: unset: `': not a valid identifier
$ env '=wibble' ksh -c 'unset ""'
ksh[1]: unset: : invalid variable name
$ env '=wibble' mksh -c 'unset ""'
mksh: : is read only
$ env '=wibble' posh -c 'unset ""'
posh: unset:  is read only
$ env '=wibble' zsh -c 'unset ""'
$ env '=wibble' zsh -c 'unset ""; env' | grep wibble
=wibble

正如你所注意到的,Python当它发现环境变量的空名称时出现错误

Perl没有这样的问题,所以它可能是您的解决方案。请注意,您必须执行新的 shell 才能使用外部进程来更改环境。

perl -e 'delete $ENV{""}; exec $ARGV[0] @ARGV' "$SHELL" "-$-"

答案2

你可以做:

import os
for k in os.environ.keys():
     print repr(k)
     del os.eniviron[k]
print os.environ
os.environ.clear()

我不确定为什么直接os.environ.clear() 抛出错误,我启动了上面的 for 循环代码,看看是否能找到导致问题的关键。请注意,您必须指定.keys(),仅迭代 usingfor k in os.environ:就会产生错误,因为您更改了正在迭代的键的字典(.keys()创建副本)。

相关内容