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

Why does "\\\\" equals "\\" in zsh?

因此,要向 stdout 写一个反斜杠,您需要

zsh$ echo \
\

你会认为要输出 2 个反斜杠,你需要 运行 这个:

zsh$ echo \\
\

错误,你需要6或8:

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

为什么我需要 8 个反斜杠?

不同 shell 中的行为:

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

不仅是 zsh,它是终端中的默认行为,反斜杠 (\) 是一个特殊字符,用于告诉 bash 脚本你想要换行符中的其他 params/texts,所以为了避免换行,你需要添加另一个反斜杠来转义特殊字符,因为反斜杠也用于转义特殊字符

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

  1. 引用删除将 \\\ 减少到 \\;每个转义 \ 都变成文字 \.
  2. echo 获取它收到的三个 \,并将第一个 \ 替换为 \。剩下的\前面没有任何内容,所以按字面意思处理。
  3. 最后的结果是两个\的输出。

对于 echo \\\\,情况如下。

  1. 和以前一样,\\\\ 变为 \\,因为每对反斜杠在删除引号后变为单个 \
  2. echo 取 4 个反斜杠,并将第一个 \ 替换为 \,将 第二个 \ 替换为 \也是,因为这次它收到了两个匹配的对。
  3. 最后的结果又是两个\

bash 可能从 ksh 继承了它的 non-POSIX 一致性,sh 根据定义是 POSIX-comformant shell,最好不要想想 csh 在做什么。