我可以使用的特定值ENV_VAR=value command
运行。等于unset的作用是什么?command
ENV_VAR
ENV_VAR
command
cmd
它。
我可以使用的特定值ENV_VAR=value command
运行。等于unset的作用是什么?command
ENV_VAR
ENV_VAR
command
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
或这种可能是更好的习惯,就搞定了。