Zsh转义反斜杠

4

我之前就注意到了,在zsh中,你可以通过输入\\来获得与bash中相同的反斜线\。

> echo \\
\

然而,在zsh中有一个带有4个反斜杠的奇怪现象。

bash$ echo \\\\
\\

zsh> echo \\\\
\

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


嘿,我发现通过发布这个帖子,Stackoverflow会打印反斜杠,无论你输入\还是\! - bruce_ricard
但是在注释中不一样,这真的很奇怪。 - bruce_ricard
1个回答

7

不,这不是一个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


那很有道理。但现在,为什么执行echo -e \会起作用呢?在阅读了您的内容之后,我认为\会被发送到echo中,然后echo会尝试解释其后面的符号,但是没有符号可供解释。所以我期望它会等待更多数据或返回错误。发生了什么? - bruce_ricard
echo仅处理提供的参数,它不读取输入,因此无法等待其他数据。任何不是已识别序列的反斜杠都会直接输出。 - qqx
好的。但是为什么会存在这种差异?是否有需要使用其中一种而不是另一种的情况? - bruce_ricard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接