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