我之前就注意到了,在zsh中,你可以通过输入\\来获得与bash中相同的反斜线\。
> echo \\
\
然而,在zsh中有一个带有4个反斜杠的奇怪现象。
bash$ echo \\\\
\\
zsh> echo \\\\
\
你知道为什么吗?这是一个bug吗?
我之前就注意到了,在zsh中,你可以通过输入\\来获得与bash中相同的反斜线\。
> echo \\
\
然而,在zsh中有一个带有4个反斜杠的奇怪现象。
bash$ echo \\\\
\\
zsh> echo \\\\
\
你知道为什么吗?这是一个bug吗?
不,这不是一个bug。只是在这些shell中的echo实现具有不同的默认设置来解释反斜杠序列。
无论哪个shell中,命令行解析器都会删除一层反斜杠,将4个反斜杠转换为2个。然后该参数传递给echo内置命令。当echo解释反斜杠序列时,对于该序列输出1个反斜杠,如果echo没有执行反斜杠解释,则输出2个反斜杠。
在任一shell的echo实现中,可以使用-e或-E选项分别启用或禁用反斜杠解释。因此,以下内容将在任何一个shell中产生相同的输出:
echo -e \\\\
echo -E \\\\
这两个 shell 都有 shell 级别的选项可以改变其 echo 命令的默认行为。在 zsh 中,可以使用 setopt BSD_echo
来更改默认设置;在 bash 中,该命令是 shopt -s xpg_echo
。
如果您想编写可移植的 shell 脚本,则最好完全避免使用 echo 命令,因为它是最不可移植的命令之一。请改用 printf
。