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

Posted

技术标签:

【中文标题】取消设置单个命令的环境变量【英文标题】:Unset an environment variable for a single command 【发布时间】:2013-09-25 05:26:33 【问题描述】:

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

FOO=bar somecommand

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

【问题讨论】:

相关的不仅仅是单个命令:***.com/questions/6877727/… 【参考方案1】:

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

FOO= some command

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

env -u FOO somecommand

【讨论】:

您也可以使用子shell:(unset FOO; some command)。但无论如何,我认为空环境变量与不存在的环境变量不同,所以我不会使用FOO= some command 方法。 (我也是)。 (OHAI cky,好久不见!) 技术上它们是环境变量,只是不适用于当前环境:the variables are added to the environment of the executed command and do not affect the current shell environment @glennjackman 不,JB 的意思是运行 FOO=bar 本身不会设置环境变量,除非导出了 FOO @JB:它也不为导出的变量调用 setenv,但它确实将它们添加到传递给子进程的环境变量列表中。由于 bash 并没有真正区分环境变量和其他类型的变量,export 的结果在执行的 shell 中并不是特别明显。 (当然,您可以看到与 declare -p 的区别。)不管您对空变量和缺失变量的感觉如何,bash 也不会真正区分它们,除非您 set -u - 如果您这样做,很多的标准脚本将中断。【参考方案2】:
env -u FOO somecommand

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

并取消设置多个变量:

env -u FOO -u FOO2 somecommand

【讨论】:

【参考方案3】:

当“somecommand”是一个shell函数时,这很棘手。

一次性环境变量赋值,例如“FOO=bar cmd”中的“FOO”,仅在调用“cmd”期间存在。 但是,如果 'cmd' 恰好是一个 shell 函数,那么 'FOO' 会被分配到正在执行的 shell 本身中,并且该分配一直保持到进程退出(除非明确取消设置)。 由于“FOO=bar shell_func”的这种副作用不太可能是故意的,因此应该避免。

为了进一步说明 FOO= aCommand 的危险性,请考虑 Git 2.26(2020 年第一季度),它避免了“FOO= shell_function(仅针对一个命令取消设置 FOO)。

参见Jonathan Nieder (artagnon)commit d6509da、commit a7fbf12、commit c7973f2(2019 年 12 月 26 日)。(由 Junio C Hamano -- gitster -- 合并到 commit c7372c9,2020 年 1 月 30 日)

fetch test:避免在 shell 函数中使用“VAR= cmd”

签字人:Jonathan Nieder

就像分配非空值一样,在调用函数时将空值分配给 shell 变量会产生不可移植的行为:在某些 shell 中,分配在函数调用期间持续,在其他情况下,它会在函数返回后持续存在。

使用带有 envvar 导出的显式子外壳,以使外壳之间的行为一致且清晰

此模式的所有先前实例都使用“VAR=value”(带有非空value),自a0a630192d(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
) &&
...

【讨论】:

【参考方案4】:

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

env -i somecommand

【讨论】:

以上是关于取消设置单个命令的环境变量的主要内容,如果未能解决你的问题,请参考以下文章

基本的bash shell命令--3

环境变量—《linux命令行与shell脚本编程大全》

在 grunt-env 中取消设置环境变量

Linux 基础-查看和设置环境变量

在 makefile 上取消设置环境变量

如何在 Kubernetes 中取消设置环境变量?