zsh 转义反斜杠

bru*_*ard 4 zsh

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

> echo \\
\
Run Code Online (Sandbox Code Playgroud)

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

bash$ echo \\\\
\\

zsh> echo \\\\
\
Run Code Online (Sandbox Code Playgroud)

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

qqx*_*qqx 7

不,这不是错误。只是这些 shell 中的 echo 实现对于反斜杠序列的解释具有不同的默认设置。

在任一 shell 中,命令行解析器将删除一层反斜杠,将 4 个反斜杠转换为 2。然后将该参数传递给echo 内置命令。当 echo 解释反斜杠序列时,该序列将输出 1 个反斜杠,如果 echo 没有完成反斜杠解释,则将输出 2 个反斜杠。

在任一 shell 的实现中echo,-eor-E选项可用于分别启用或禁用反斜杠解释。因此,以下将在任一 shell 中产生相同的输出:

echo -e \\\\
echo -E \\\\
Run Code Online (Sandbox Code Playgroud)

两个 shell 还具有 shell 级选项来更改其 echo 命令的默认行为。在 zsh 中,可以使用 更改默认值setopt BSD_echo,要更改 bash 中的默认值,命令是shopt -s xpg_echo.

如果您正在尝试编写可移植的 shell 脚本,最好完全避免使用 echo;它是最不便携的命令之一。使用printf来代替。