【问题标题】:Why does "\\\\" equals "\\" in zsh?为什么“\\\\”在zsh中等于“\\”?
【发布时间】:2019-10-18 06:10:36
【问题描述】:

所以要给stdout写一个反斜杠你做

zsh$ echo \\
\

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

zsh$ echo \\\\
\

错误,您需要 6 或 8 个:

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

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

不同shell中的行为:

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

【问题讨论】:

  • wrt to write a backslash to stdout you do echo \\ - 不,要在 stdout 上写一个反斜杠,你要 echo '\' 写两个反斜杠是 echo '\\'。除非您需要使用双引号(例如,让变量扩展),否则始终使用单引号脚本和字符串,然后始终使用双引号,除非您不需要使用任何(例如,允许通配符)。添加缺少的引号,重新运行您的命令,然后询问您是否还有问题。
  • @EdMorton 哦,我的上帝 ???? ,我不知道单引号是不可避免的。我以为单引号和双引号是一样的。你刚刚为我节省了很多时间(和反斜杠)
  • 单引号与双引号之间以及引号与不引号之间存在巨大的差异。见mywiki.wooledge.org/Quotes
  • \\'\' 是等价的;引号只是转义引号之间每个字符的快捷方式。

标签: bash shell sh zsh ksh


【解决方案1】:

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

【讨论】:

  • 这不能回答我的问题,为什么 "echo \\\\" 在 bash 中输出 "\" 而在 zsh 中输出 "\\" ?或者换一种说法,为什么 "echo \\\\" 和 "echo \\" 在 zsh 中输出相同的东西?
  • 啊抱歉,我错过了你的问题,来自 zsh doc:zsh.sourceforge.net/Doc/Release/Shell-Builtin-Commands.html,zsh 有自己的 echo 实现,它为 bash echo 添加了另一层,你需要 -E 标志或 BSD_ECHO 选项禁用 zsh 的转义
  • 由于 zsh 为 bash echo 添加了另一层,zsh \\\\ 将解释为 bash \\,在 bash 中 \\ 将解释为 \,这就是为什么最后只有 \ 的原因
  • 谢谢,我认为@EdMorton 的评论正是我想要的。我猜sh 的实现有一个类似的“问题”。
【解决方案2】:

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

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

有了echo \\\\\\\\,会发生这样的事情。

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

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

【讨论】:

    最近更新 更多