4

我前段时间已经注意到,在 zsh 中,您可以像在 bash 中一样通过键入 \\ 来获得 \。

> echo \\
\

但是,在 zsh 中有一个奇怪的现象,有 4 次反冲。

bash$ echo \\\\
\\

zsh> echo \\\\
\

你知道为什么吗 ?这是一个错误吗?

4

1 回答 1

7

不,这不是错误。只是这些 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

于 2013-05-08T01:23:33.473 回答