【问题标题】:Double backslash in zsh is interpreted to a single backslash ('\\' -> \)zsh 中的双反斜杠被解释为单个反斜杠('\\' -> \)
【发布时间】:2018-09-28 10:12:25
【问题描述】:

在 zsh 中:

>> echo '\\'
\

我希望单引号之间的字符串根本不会被解释,(bash 会显示 //)。所以我想知道为什么 zsh 把这里的双反斜杠变成了单反斜杠。

也许这是我可以设置的选项?

【问题讨论】:

  • 无法复制。你确定你没有想到echo '\\',它会输出一个反斜杠吗?
  • @chepner 哎呀,这确实是相反的。对不起。

标签: shell command-line escaping zsh oh-my-zsh


【解决方案1】:
➜  ~ echo $SHELL
/bin/zsh
➜  ~ echo "//"
//
➜  ~ echo '//'
//
➜  ~ echo //
//
➜  ~ echo "\/"
\/
➜  ~ echo '\/'
\/
➜  ~ echo \/
/
➜  ~ which echo
echo: shell built-in command
➜  ~

您可能会注意到 zsh 有自己的内置 echo,因此您可以通过 -e/-E 选项控制您期望的行为。见http://zsh.sourceforge.net/Doc/Release/Shell-Builtin-Commands.html

➜  ~ echo -E '\\'
\\
➜  ~ echo -e '\\'
\
➜  ~ echo -e '//'
//
➜  ~ echo -E '//'
//
➜  ~ 

【讨论】:

  • OP 声称从echo '//' 得到一个斜线。这并没有提供任何解释说明这是怎么可能的。
  • 另外,$SHELL 的值并不能告诉您 当前 正在运行什么 shell,只告诉您哪个 shell 用作您的登录 shell。
【解决方案2】:

echo,默认情况下,在zsh 中是符合POSIX 的,这意味着echo 本身会特别处理某些以\ 开头的字符对。确实,在单引号内,没有任何东西被转义。单个反斜杠可以出现在单引号内:

% echo '\'
\

两个反斜杠也可以使用'\\' 传递给echo。然而,现在echo 本身\\ 视为一对表示单个反斜杠,因为某些其他对被特殊对待。举两个例子,\t 代表一个水平标签

% echo 'a\tb'
a   b

\n 表示换行

% echo 'a\nb'
a
b

这意味着能够打印两个字符\n,例如,您需要某种方式来指定反斜杠,而不会转义以下n。那就是\\:

% echo '\\n'
\n

【讨论】:

    猜你喜欢
    • 2010-12-14
    • 2013-04-15
    • 2010-09-11
    • 1970-01-01
    • 2012-06-16
    • 2017-07-25
    • 1970-01-01
    • 2012-02-10
    相关资源
    最近更新 更多