为什么在zsh中“ \\\\”等于“ \\”?

时间:2019-06-02 11:36:19

标签: bash shell sh zsh ksh

因此,您可以对stdout写一个反斜杠

zsh$ echo \\
\

您会认为要输出2个反斜杠,需要运行以下命令:

zsh$ echo \\\\
\

错误,您需要6或8:

zsh$ echo \\\\\\
\\
zsh$ echo \\\\\\\\
\\

为什么在地球上我需要8个反斜杠?

不同外壳中的行为:

ksh$ echo \\\\
\\
zsh$ echo \\\\
\
bash$ echo \\\\
\\
sh$ echo \\\\
\
csh$ echo \\\\
\\

Backslashes

2 个答案:

答案 0 :(得分:4)

您可能已经习惯了bash的内置echo,而 not 不会执行转义序列的扩展。 POSIX echo zsh遵循POSIX规范,因此当您编写echo \\\\\\时,会发生以下情况。

  1. 行情删除将\\\\\\减少为\\\;每个转义的\都会变成文字\
  2. echo接收它收到的三个\,并将第一个\\替换为\。其余的\之前没有任何内容,因此将按字面意义处理。
  3. 最终结果是两个\的输出。

使用echo \\\\\\\\,会发生以下情况。

  1. 像以前一样,\\\\\\\\变成\\\\,因为在引用删除后,每对反斜杠都变成一个\
  2. echo取4个反斜杠,并将第一个\\替换为\,将 second \\替换为\好吧,因为这一次它收到了两个匹配的对。
  3. 最终结果还是两个\

bash可能从ksh继承了其非POSIX规范,根据定义,sh是一个POSIX规范的shell,最好不要考虑csh是什么做。

答案 1 :(得分:0)

不仅zsh是终端的默认行为,反斜杠(\)是一个特殊字符,用于告诉bash脚本您要换行中的其他参数/​​文本,因此要避免换行,您需要添加另一个反斜杠用于转义特殊字符,因为反斜杠也用于转义特殊字符