ll *_*ool 3 shell bash quoting command-substitution
命令
echo `echo \\\\\\\z`
Run Code Online (Sandbox Code Playgroud)
来自这本书,我不明白为什么它会打印
\\z
Run Code Online (Sandbox Code Playgroud)
当它通过 bash 脚本执行时。
我认为它应该打印
\\\z
Run Code Online (Sandbox Code Playgroud)
反斜杠有效地为您提供了反斜杠的双重处理。(一次是主命令行被处理,另一次是命令替换中的命令。)
就像 Kusalanda 所说的那样,$(..)
命令替换是不同的。
首先,让我们注意我们似乎在谈论 Bash 的echo
,默认情况下它不处理反斜杠转义本身,因此例如echo '\\'
传递\\
给echo
which prints \\
。如果您使用echo
处理反斜杠本身的an (如 Bash with shopt -s xpg_echo
、或 Dash 或 zsh),您将得到最后一个\\
变成\
and\z
作为输出。
当使用旧式反引号替换形式时,反斜杠保留其字面含义,除非后跟 [美元符号、反引号或反斜杠]。
所以,在命令中
echo `echo \\\\\\\z` # 7 backslashes
Run Code Online (Sandbox Code Playgroud)
在\\
对获得第一缩小到个\
s,并且\z
保持原样\z
(它不跟任何三个,让反斜线是文字)。然后反引号中的命令再次通过 shell。
所以命令替换中的命令最终为
echo \\\\z # 4 backslashes
Run Code Online (Sandbox Code Playgroud)
其中\\
成对减少为单个\
s,并且参数echo
变为\\z
(通过两个echo
s打印不变,请参阅上面的警告)。
您可以使用美元符号看到类似的结果,例如:
var=foo
echo `echo \$var`
Run Code Online (Sandbox Code Playgroud)
打印foo
。
echo `echo '\$x'`
Run Code Online (Sandbox Code Playgroud)
打印$x
。(单引号不保护$
)
$(...)
命令替换的形式更合理,它的内容只处理一次,所以:
echo $(echo \\\\\\\z) # 7 backslashes
Run Code Online (Sandbox Code Playgroud)
打印\\\z
(3) 和
var=foo
echo $(echo \$var)
Run Code Online (Sandbox Code Playgroud)
打印$var
。
另见: