命令替换和双引号:为什么结果不同?

Sla*_*hin 5 shell bash command-substitution

这是一个反引号和 $() 行为不同的示例:

$ echo "$(echo \"test\")"
"test"
$ echo "`echo \"test\"`"
test
Run Code Online (Sandbox Code Playgroud)

我的理解是这是因为“反引号内的反斜杠 (\) 以不明显的方式处理”

但这似乎是另一回事,因为当我删除外部双引号时,结果变得相似:

$ echo $(echo \"test\")
"test"
$ echo `echo \"test\"`
"test"
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下它是如何工作的以及为什么 "`echo \"test\"`" 删除双引号?

pLu*_*umo 7

你是对的,在这种情况下是另一回事。

解决方案仍然在同一个链接中,但第二点:

  • $() 内的嵌套引用要方便得多。

    [...]

    `...` 需要在内部引号周围使用反斜杠以便可移植。

因此,

echo "`echo \"test\"`"
Run Code Online (Sandbox Code Playgroud)

不等于这个:

echo "$(echo \"test\")"
Run Code Online (Sandbox Code Playgroud)

但是这个:

echo "$(echo "test")"
Run Code Online (Sandbox Code Playgroud)

您需要将其与此进行比较:

echo "`echo \\"test\\"`"
Run Code Online (Sandbox Code Playgroud)