我可以运行以特定值ENV_VAR=value command
运行。相当于 unset for 的是什么?command
ENV_VAR
ENV_VAR
command
答案1
除了-i
擦除整个环境的选项之外,POSIXenv
不提供任何取消设置变量的方法。
然而,通过一些env
实现(至少包括 GNUbusybox
和 FreeBSD),您可以这样做:
env -u ENV_VAR command
这将有助于ENV_VAR
从环境中删除变量的每个实例(请注意,它不适用于具有空名称的环境变量(env -u ''
要么给出错误,要么根据实现而无效,即使全部接受env '=value'
,可能是一个限制)由 C 函数引起unsetenv()
,POSIX 要求返回空字符串错误,而 )) 则没有这样的限制putenv()
。
可移植地(在 POSIX shell 中),您可以执行以下操作:
(unset -v ENV_VAR; exec command)
(请注意,对于某些 shell,使用exec
可以更改command
运行的命令:运行文件系统中的命令而不是函数或内置命令(并且alias
显然会绕过扩展),如上env
所示。在这些情况下,您需要忽略它) 。
但这不适用于名称不可映射到 shell 变量的环境变量(请注意,某些 shellmksh
无论如何都会在启动时从环境中删除这些变量)或已标记为只读的变量。
-v
用于 Bourne shell,如果没有bash
它可以取消设置unset
-v
ENV_VAR
功能如果没有多变的以这个名字。大多数其他 shell 不会取消设置函数,除非您传递该-f
选项。 (在实践中不太可能产生影响)。
bash
(还要注意//mksh
的bug/ yash
misfeatureunset
在某些情况下可能不会取消设置变量,但是显示外部作用域中的变量)
如果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...
它)
对于某些 shell,您可以使用函数为变量创建本地作用域:
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}
该方法在某些 shell 中不起作用(例如基于 Almquist shell 的 shell),这些 shelllocal
不会将变量声明为最初未设置(但继承值和属性)。在这些中,您可以执行local ENV_VAR; unset ENV_VAR
,但不要在mksh
or yash
(typeset
而不是local
那个)中执行此操作,因为那样行不通,unset
只会取消local
.
还请注意,在 中bash
,本地ENV_VAR
(即使未设置)将保留出口属性。因此,如果command
是一个为 赋值的函数ENV_VAR
,则该变量将在随后调用的命令的环境中可用。unset ENV_VAR
会清除该属性。或者您可以使用local +x ENV_VAR
它也可以确保一个干净的状态(除非该变量已被声明为只读,但您在 中对此无能为力bash
)。
答案2
据我所知,没有直接的等价物;你可以使用子shell:
(unset ENV_VAR; exec command)
答案3
您可以使用ENV_VAR= command
这实际上并没有取消设置变量,但它在许多情况下可能很有用(shell 脚本通常仅用于test -n
检查变量是否已设置):
$ export ENV_VAR=foo
$ mycommand
ENV_VAR: foo
$ ENV_VAR=bar mycommand
ENV_VAR: bar
$ ENV_VAR= mycommand
ENV_VAR: