取消为单个命令设置环境变量

时间:2013-09-19 23:04:50

标签: bash unix environment-variables

在Bash中,我们可以通过这种方式为单个命令设置环境变量:

FOO=bar somecommand

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

4 个答案:

答案 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 d6509dacommit a7fbf12commit c7973f2Jonathan 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