为什么“\\\\”在 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 \\\
时,会发生以下情况。
- 引用删除将
\\\
减少到 \\
;每个转义 \
都变成文字 \
.
echo
获取它收到的三个 \
,并将第一个 \
替换为 \
。剩下的\
前面没有任何内容,所以按字面意思处理。
- 最后的结果是两个
\
的输出。
对于 echo \\\\
,情况如下。
- 和以前一样,
\\\\
变为 \\
,因为每对反斜杠在删除引号后变为单个 \
。
echo
取 4 个反斜杠,并将第一个 \
替换为 \
,将 第二个 \
替换为 \
也是,因为这次它收到了两个匹配的对。
- 最后的结果又是两个
\
。
bash
可能从 ksh
继承了它的 non-POSIX 一致性,sh
根据定义是 POSIX-comformant shell,最好不要想想 csh
在做什么。
因此,要向 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 \\\
时,会发生以下情况。
- 引用删除将
\\\
减少到\\
;每个转义\
都变成文字\
. echo
获取它收到的三个\
,并将第一个\
替换为\
。剩下的\
前面没有任何内容,所以按字面意思处理。- 最后的结果是两个
\
的输出。
对于 echo \\\\
,情况如下。
- 和以前一样,
\\\\
变为\\
,因为每对反斜杠在删除引号后变为单个\
。 echo
取 4 个反斜杠,并将第一个\
替换为\
,将 第二个\
替换为\
也是,因为这次它收到了两个匹配的对。- 最后的结果又是两个
\
。
bash
可能从 ksh
继承了它的 non-POSIX 一致性,sh
根据定义是 POSIX-comformant shell,最好不要想想 csh
在做什么。