我发现在 bash 中
echo `echo \\`
输出 \
\
但
echo `echo \\ `
什么也不输出
答案1
当使用旧式反引号形式的替换时,反斜杠保留其字面含义,除非后跟“$”、“`”或“\”。
也就是说,反斜杠会避开美元符号、反引号和其他反斜杠在将命令交给 shell 进行处理之前(包括在反斜杠转义和引号的普通处理之前)。这意味着:
`echo \\ `
相当于
$(echo \ )
并输出一个空格。该单个空格作为参数插入到 external 中echo
,然后通常在字段分割期间丢失,因此只是echo
不带参数的裸运行。
另一方面
`echo \\`
\
在命令末尾留下一个悬空,这通常是不合法的(它会指示在其他地方继续行),并且它被视为文字。bash
和都dash
这样做,就像 一样tcsh
,但zsh
没有。似乎没有明确指定在 POSIX 中或其他地方,所以我认为这是实现定义的行为。
相反,使用$( ... )
命令替换可以让您在其中编写任何脚本而不会受到干扰。它几乎总是比反引号替换更好。