zsh 中的双反斜杠被解释为单反斜杠 ('\\' -> \)

Double backslash in zsh is interpreted to a single backslash ('\\' -> \)

在 zsh 中:

>> echo '\'
\

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

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

➜  ~ 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 '//'
//
➜  ~ 

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

% echo '\'
\

也可以使用 '\' 将两个反斜杠传递给 echo。但是,现在 echo 本身 \ 视为表示单个反斜杠的一对,因为某些其他对被特殊对待。仅举两个例子,\t 表示水平制表符

% echo 'a\tb'
a   b

\n表示换行

% echo 'a\nb'
a
b

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

% echo '\n'
\n