不久前我已经注意到,在 zsh 中,您可以像在 bash 中一样通过键入 \\ 来获得 \。
> echo \\
\
Run Code Online (Sandbox Code Playgroud)
但是,在 zsh 中有 4 个反冲的奇怪现象。
bash$ echo \\\\
\\
zsh> echo \\\\
\
Run Code Online (Sandbox Code Playgroud)
你知道为什么吗 ?这是一个错误吗?
不,这不是错误。只是这些 shell 中的 echo 实现对于反斜杠序列的解释具有不同的默认设置。
在任一 shell 中,命令行解析器将删除一层反斜杠,将 4 个反斜杠转换为 2。然后将该参数传递给echo
内置命令。当 echo 解释反斜杠序列时,该序列将输出 1 个反斜杠,如果 echo 没有完成反斜杠解释,则将输出 2 个反斜杠。
在任一 shell 的实现中echo,-eor-E选项可用于分别启用或禁用反斜杠解释。因此,以下将在任一 shell 中产生相同的输出:
echo -e \\\\
echo -E \\\\
Run Code Online (Sandbox Code Playgroud)
两个 shell 还具有 shell 级选项来更改其 echo 命令的默认行为。在 zsh 中,可以使用 更改默认值setopt BSD_echo,要更改 bash 中的默认值,命令是shopt -s xpg_echo.
如果您正在尝试编写可移植的 shell 脚本,最好完全避免使用 echo;它是最不便携的命令之一。使用printf来代替。
| 归档时间: |
|
| 查看次数: |
3365 次 |
| 最近记录: |