zsh 变量替换修改周围的字符串

zsh variable substitution modifies surrounding string

为什么在下面的示例中缺少“c”字符?

var="\bINSERT"
echo abc${var}def
> abINSERTdef

是否有任何文档告诉我如何做类似的事情或禁用该行为?

我找不到任何 shell 变量文档。

命令替换没有做错任何事情——它的行为令人惊讶的是 echo(合法;POSIX 允许但不要求 echo 解释反斜杠转义默认顺序,所以zsh在这里没有错)。

printf '%s\n' abc${var}def

...没有你的问题(但为了非 zsh shell 的可移植性,我会引用 "abc${var}def")。

Why is printf better than echo? on Unix & Linux Stack Exchange, and the POSIX spec for echo at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html

正如评论中已经提到的,内部 echo 的 zsh 实现与外部 echo 命令实现的不同。

如果您想继续使用 echo,有几种解决方法:

  1. 做一个echo -E ...-E 关闭反斜杠解释。
  2. 做一个command echo ...;关键字 command 强制 shell 使用外部 echo 命令。
  3. 在 shell 中设置选项 set bsd_echo,然后保持 echo 命令不变。该选项告诉 shell 默认情况下不对其内部 echo 命令使用反斜杠解释。