我可以使用的特定值ENV_VAR=value command运行。等于unset的作用是什么?commandENV_VARENV_VARcommand
cmd它。
我可以使用的特定值ENV_VAR=value command运行。等于unset的作用是什么?commandENV_VARENV_VARcommand
cmd它。
Answers:
除了使用-i可擦除整个环境的选项外,POSIX env不提供任何方法来取消设置变量。
但是,通过一些env实现(busybox至少包括GNU,'和FreeBSD),您可以执行以下操作:
env -u ENV_VAR command
这可以ENV_VAR从环境中删除变量的每个实例(请注意,尽管它不适用于名称为空的环境变量(env -u ''根据实现的不同,它会产生错误或无效,即使全部接受env '=value',也可能是一个限制)unsetenv()POSIX要求C函数引起的返回空字符串错误,而putenv()))没有这种限制。
可移植地(在POSIX shell中),您可以执行以下操作:
(unset -v ENV_VAR; exec command)
(请注意,在某些外壳程序中,using exec可以更改command运行的程序:例如,在文件系统中而不是函数或内置程序中运行(并且alias显然会绕过扩展),就像env上面那样。在这种情况下,您可以忽略它) 。
但这不适用于名称不可映射到外壳变量mksh的环境变量(请注意,某些外壳程序无论如何都会在启动时将这些变量从环境中删除),或已标记为只读的变量。
-v对于Bourne shell和bash其unset不-v能够取消设置ENV_VAR 的功能如果没有变量这个名字。除非您通过该-f选项,否则其他大多数Shell都不会取消设置功能。(不太可能在实践中有所作为)。
(另外注意的错误/不好的特性的bash/ mksh/ yash其unset,在某些情况下可以不取消设置变量,但显示在可变外部范围)
如果perl可用,您可以执行以下操作:
perl -e 'delete $ENV{shift@ARGV}; exec @ARGV or die$!' ENV_VAR command
即使对于具有空名称的环境变量也可以使用。
现在,如果您要为内置函数或函数更改环境变量并且不希望它们在子shell中运行,那么所有这些将不起作用,例如bash:
env -u LANG printf -v var %.3f 1.2 # would run /usr/bin/printf instead
(unset -v LANG; printf -v var %.3f 1.2) # changes to $var lost afterwards
(这里将LANG设置为一种误导方法,以确保.使用并理解为小数点分隔符。LC_ALL=C printf...为此,最好使用该方法)
在某些外壳程序中,您可以使用函数为变量创建局部作用域:
without() {
local "$1" # $1 variable declared as initially unset in bash¹
shift
"$@"
}
without LANG printf -v var %.3f 1.2
使用zsh,您还可以使用匿名函数:
(){local ENV_VAR; command}
这种方法在某些外壳程序(例如基于Almquist外壳程序的外壳程序)中local不起作用,它们不会将变量声明为初始未设置(而是继承值和属性)。在这种情况下,您可以这样做local ENV_VAR; unset ENV_VAR,但不要在mksh或yash(typeset而不是local针对那个)中这样做,因为那样行不通,unset只能取消local。
¹另外请注意,在中bash,本地ENV_VAR(即使未设置)将保留导出属性。因此,如果command是一个为赋值的函数ENV_VAR,则该变量将在随后调用的命令环境中可用。unset ENV_VAR会清除该属性。或者,您也可以使用local +x ENV_VAR这样做,以确保状态良好(除非该变量已声明为只读,但在中您无能为力bash)。
env '=foo' python -c 'import os; print os.environ[""]'。我不希望很多人愿意设置这样的变量。
command是一个不幸的占位符选择,因为实际上有一个内置命令使用该名称。mycommand或somecommand或这种可能是更好的习惯,就搞定了。