当我运行时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
就找到了该实用程序。请注意,这里的 从未在当前环境中扩展,而是由./mybin
PATH
PATH
which
顺便说一句,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'