为什么当我更改 ENV 变量并在同一命令中回显它时,我看不到新值?

为什么当我更改 ENV 变量并在同一命令中回显它时,我看不到新值?

当我运行时PATH=abc:$PATH echo $PATH,我得到的是旧值PATH,而不是abc:PATH

为什么是这样?我怎样才能得到abc:$PATH

PATH=/mybin:$PATH which python编辑:如果/mybin有 python 可执行文件怎么样?

答案1

当你跑步时

PATH=abc:$PATH echo $PATH

或者,在更一般的情况下,

variable=value utility

然后variable在环境中设置utility(但不是在当前环境中)。

然而,当你的命令行被解析时,变量的值PATH是从当前的环境。

您必须在变量扩展的环境中设置变量。您可以通过将其分为两个步骤来完成此操作,如

PATH=abc:$PATH; echo "$PATH"

这将PATH在当前环境中设置,并且然后execute echo "$PATH",或为子 shell 设置变量,如下所示

PATH=abc:$PATH sh -c 'echo "$PATH"'

PATH这将在 中设置变量sh -c,但不在当前 shell 中。

在你的第二个例子中,

PATH=/mybin:$PATH which python

which实用程序可能会说自从您在其环境中进行修改以来python就找到了该实用程序。请注意,这里的 从未在当前环境中扩展,而是由./mybinPATHPATHwhich

顺便说一句,which python写得更好(更便携)command -v python(参见“为什么不用“哪个”呢?那该用什么呢?”)。


只是快速反思一下你的标题,你所说的“ENV变量”。该ENV变量,即使这不是您的意思,也恰好是某些实现sh(以及其他一些 shell)使用的环境变量。如果其值是文件名,则将在启动交互式 shell 会话之前获取该文件。 bash有一个BASH_ENV变量,其工作方式相同,但适用于非交互式 shell。

答案2

原因是扩展echo $PATH发生在创建修改后的环境之前。

您可能想致电:

PATH=abc:$PATH env

可以看到命令的环境确实被修改了。

由于 echo 参数的扩展

PATH=abc:$PATH echo $PATH

在设置新环境之前发生,您需要将其分成两个命令:

(PATH=abc:$PATH; echo $PATH)

做你喜欢的事。需要使用 sub shell () 来防止环境发生变化,以便在echo命令的生命周期内继续存在。

答案3

在子 shell 而不是当前 shell 中执行替换。

PATH=abc:$PATH sh -c 'echo $PATH'

相关内容