我知道变量扩展发生在命令替换之前,但我仍然不确定这一点。
给定“name”是一个值为“abc”的shell变量,当我运行
echo $(echo $name)
时,以下哪一项是正确的:
echo $(echo abc)
,然后发生命令替换。name
不是直接展开的。相反,变量扩展发生在 $(echo $name)
内部。我尝试了以下方法。
$ name=abc
$ echo $(name=xyz; echo $name)
代码确实输出了 xyz,这表明 $name 的扩展发生在
$()
内部。这似乎与由于命令替换而发生变量扩展的规则相矛盾。
我确实发现了一个类似的问题变量扩展和命令替换之间的扩展顺序,但那是13年前的事了,而且还没有令人信服的答案。
在
EXPANSION
的man bash
部分:
The order of expansions is: brace expansion; tilde expansion, parameter
and variable expansion, arithmetic expansion, and command substitution
(done in a left-to-right fashion); word splitting; and pathname
expansion.
在
Command Substitution
部分:
When using the $(command) form, all characters between
the parentheses make up the command; none are treated specially.
因此,
$()
中的命令保持不变(命令替换中没有扩展),直到它在子 shell 中执行。因此我们可以肯定地说结果将是:
$ name=abc
$ echo $(name=xyz; echo $name)
xyz