tmpbin Asked: 2017-12-04 00:20:04 +0800 CST2017-12-04 00:20:04 +0800 CST 2017-12-04 00:20:04 +0800 CST 有人可以解释命令替换中反斜杠的奇怪行为吗? 772 我发现在 bash echo `echo \\` 输出 \ \ 但 echo `echo \\ ` 什么都不输出 bash echo 1 个回答 Voted Best Answer Michael Homer 2017-12-04T01:33:27+08:002017-12-04T01:33:27+08:00 反斜杠样式命令替换中反斜杠的记录行为是: 当使用旧式反引号形式的替换时,反斜杠保留其字面含义,除非后面跟着“$”、“`”或“\”。 也就是说,反斜杠在将命令交给 shell 处理之前(包括在反斜杠转义和引号的普通处理之前)转义美元符号、反引号和其他反斜杠。这意味着: `echo \\ ` 相当于 $(echo \ ) 并输出一个空格。该单个空格作为参数插入到您的外部echo,然后通常在字段拆分期间丢失,因此只是echo没有参数的裸运行。 另一方面 `echo \\` 在命令末尾留下一个悬空\,这通常是不合法的(它会指示其他地方的行继续),并且它被视为文字。两者都bash这样dash做,就像这样做tcsh,但zsh不这样做。它似乎没有在 POSIX或其他地方明确指定,所以我认为这是实现定义的行为。 相反,使用$( ... )命令替换可以让您在其中编写任何脚本而不会受到干扰。它几乎总是比反引号替换更好。
反斜杠样式命令替换中反斜杠的记录行为是:
也就是说,反斜杠在将命令交给 shell 处理之前(包括在反斜杠转义和引号的普通处理之前)转义美元符号、反引号和其他反斜杠。这意味着:
相当于
并输出一个空格。该单个空格作为参数插入到您的外部
echo
,然后通常在字段拆分期间丢失,因此只是echo
没有参数的裸运行。另一方面
在命令末尾留下一个悬空
\
,这通常是不合法的(它会指示其他地方的行继续),并且它被视为文字。两者都bash
这样dash
做,就像这样做tcsh
,但zsh
不这样做。它似乎没有在 POSIX或其他地方明确指定,所以我认为这是实现定义的行为。相反,使用
$( ... )
命令替换可以让您在其中编写任何脚本而不会受到干扰。它几乎总是比反引号替换更好。