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
,有几种解决方法:
- 做一个
echo -E ...
; -E
关闭反斜杠解释。
- 做一个
command echo ...
;关键字 command 强制 shell 使用外部 echo 命令。
- 在 shell 中设置选项
set bsd_echo
,然后保持 echo
命令不变。该选项告诉 shell 默认情况下不对其内部 echo 命令使用反斜杠解释。
为什么在下面的示例中缺少“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
,有几种解决方法:
- 做一个
echo -E ...
;-E
关闭反斜杠解释。 - 做一个
command echo ...
;关键字 command 强制 shell 使用外部 echo 命令。 - 在 shell 中设置选项
set bsd_echo
,然后保持echo
命令不变。该选项告诉 shell 默认情况下不对其内部 echo 命令使用反斜杠解释。