55

在 Bash 中,我们可以这样为单个命令设置环境变量:

FOO=bar somecommand

如果我们想为单个命令取消设置变量怎么办?

4

4 回答 4

58

从技术上讲,它们不是环境变量,直到有人使用export它们。但是您至少可以将它们设置为空:

FOO= some command

如果将它们从环境中移除就足够了,您可以使用env

env -u FOO somecommand
于 2013-09-19T23:08:08.500 回答
13
env -u FOO somecommand

FOO这将从somecommand进程的环境中删除环境变量。

并取消设置多个变量:

env -u FOO -u FOO2 somecommand
于 2017-01-19T19:01:31.170 回答
3

对于任何打算在没有任何环境变量的情况下运行命令的人,您可以通过运行:

env -i somecommand
于 2020-07-20T23:23:18.273 回答
2

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_functionFOO仅针对一个命令取消设置)。

请参阅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
) &&
...
于 2020-02-03T17:20:54.617 回答