当我回显原始变量时,反斜杠在 zsh 中消失

Backslash disappears in zsh when I echo a raw variable

当我在 bash 中以原始模式阅读时:

read -r v

现在输入 5 个字符(引号、反斜杠、反斜杠、x、引号):

"\x"

然后我做了

echo $v

显示

"\x"

这是我所期望的:由于 -r 开关,我取回了我输入的内容。当我在 zsh 中执行完全相同的操作时,echo $v 会显示

"\x"

相反。来自联机帮助页 zshbuiltins:

-r : Raw mode: a `\' at the end of a line does not signify line continuation and backslashes in the line don't quote the following character and are not removed.

所以 zsh 应该表现相同,不是吗?什么在吃我的反斜杠?

反斜杠在输出过程中被移除,而不是在输入过程中。 zsh 的 内置 echo 默认计算转义序列。这可以通过 -E 命令行选项或设置 BSD_ECHO shell 选项来防止:

% read -r v
"\x"
% echo $v
"\x"
% echo -E $v
"\x"
% setopt BSD_ECHO
% echo $v
"\x"
% echo $#v
5

最后一行打印 v 中字符串的长度,表明所有 5 个字符都在那里。