我前段时间已经注意到,在 zsh 中,您可以像在 bash 中一样通过键入 \\ 来获得 \。
> echo \\
\
但是,在 zsh 中有一个奇怪的现象,有 4 次反冲。
bash$ echo \\\\
\\
zsh> echo \\\\
\
你知道为什么吗 ?这是一个错误吗?
我前段时间已经注意到,在 zsh 中,您可以像在 bash 中一样通过键入 \\ 来获得 \。
> echo \\
\
但是,在 zsh 中有一个奇怪的现象,有 4 次反冲。
bash$ echo \\\\
\\
zsh> echo \\\\
\
你知道为什么吗 ?这是一个错误吗?
不,这不是错误。只是这些 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
。