在Bash中,我们可以通过这种方式为单个命令设置环境变量:
FOO=bar somecommand
如果我们想为单个命令取消变量怎么办?
答案 0 :(得分:36)
从技术上讲,在有人export
之前,它们不是环境变量。但你至少可以将它们设置为空:
FOO= some command
如果从环境中删除它们就足够了,您可以使用env
:
env -u FOO somecommand
答案 1 :(得分:3)
env -u FOO somecommand
这将从FOO
进程中删除环境变量somecommand
。环境。
取消设置多个变量:
env -u FOO -u FOO2 somecommand
答案 2 :(得分:1)
当“ somecommand
”是 shell函数时,这很麻烦。
仅在调用“ FOO
”期间才存在一次性环境变量分配,例如“ FOO=bar cmd
”中的“ cmd
”。
但是,如果'cmd
'恰好是Shell函数,则在执行Shell本身中分配'FOO
',并且该分配一直保持到进程退出为止(除非显式取消设置)。
由于“ FOO=bar shell_func
”的副作用不太可能是故意的,因此应避免。
为进一步说明FOO= aCommand
的危险性,请考虑使用Git 2.26(2020年第1季度),它避免了“ FOO = shell_function
(仅对一个命令取消设置FOO
)。 >
请参见commit d6509da的commit a7fbf12,commit c7973f2,Jonathan Nieder (artagnon
)(2019年12月26日)。
(由Junio C Hamano -- gitster
--在commit c7372c9中合并,2020年1月30日)
fetch test
:避免在外壳函数中使用“ VAR = cmd”签名人:乔纳森·尼德
就像分配非空值一样,在调用函数时将空值分配给shell变量会产生不可移植的行为:在某些shell中,分配在函数调用期间一直存在,在其他情况下,它在函数返回后仍然存在。
使用导出的
envvar
的显式子外壳,使行为在各个外壳之间保持一致并保持清晰。此模式的所有先前实例都使用“
VAR=value
”(带有非空的value
),自a0a630192d起,“ make test-lint”已自动诊断出该错误(t / check- non-portable shell:检测到“FOO=bar shell_func
”,2018-07-13)。
例如,代替:
GIT_TEST_PROTOCOL_VERSION= trace_fetch client origin to_fetch
使用子shell:
(
GIT_TEST_PROTOCOL_VERSION= &&
export GIT_TEST_PROTOCOL_VERSION &&
trace_fetch client origin to_fetch
) &&
...
答案 3 :(得分:1)
对于打算在不使用任何环境变量的情况下运行命令的任何人,都可以通过运行以下命令来实现:
env -i somecommand