为什么"var=value somecommand"不保留 var 的新值?


$ A=123
$ echo $A  # now value of A is 123
123
$ A=456 echo a random following command
a random following command
$ echo $A  # we can see that A reminds 123 unchanged
123

为什么在遵循和不遵循命令的情况下它的工作方式不同?
任何办公室 bash 文档链接都是有帮助的。

此命令:

A=456 echo a random following command

类似于此命令:

env A=456 echo a random following command

A的新值456将仅用于echo命令。在命令echo执行后,变量A恢复原始值。

官方文件是Bash参考手册:环境;正如它所解释的那样:

任何简单命令或函数的环境都可以通过在它前面加上参数赋值来临时增强,如 Shell 参数中所述。这些赋值语句仅影响该命令看到的环境。


更新0x00

当我们运行以下命令时:

A=123
A=456 echo $A

输出仍然是123,而不是456。原因是 Bash 将在执行命令之前先评估$AA=456 echo $A。所以命令:

A=456 echo $A

成为

A=456 echo 123

然后我们得到了输出123.

但以下示例有所不同

A=123
A=456 eval echo '$A'

此输出456

由于'$A'是一个普通字符串,因此 Bash 在运行命令之前不会对其进行计算。当eval命令运行时,变量A设置为456by Bash。


更新0x01

子 shell 也是一个子进程,但未标记为导出的变量仍可用于子 shell。

Bash 参考手册:命令执行环境,正如它所解释的那样:

命令

替换、用括号分组的命令和异步命令在与 shell 环境重复的子 shell 环境中调用

A=123
( eval echo $A )

输出为123。即使我们将(eval echo $A)放入后台,输出仍然123.

A=123
( eval echo $A )&

当我们执行一个简单的命令,而不是内置或 shell 函数时,例如执行脚本。此脚本在单独的 shell 环境中调用。只有标记为导出的 shell 变量可用于分离的环境。

A=123
bash -c 'echo A1=$A'
export A
bash -c 'echo A2=$A'

输出为:

A1=
A2=123

最新更新