在 Zsh 5.9 中,我们可以使用printf
shell 转义字符串:
$ printf '%q' 'One! Two'
One\!\ Two
!
这会产生转义和 空间的正确输出。现在让我们将其作为脚本:
#!/bin/zsh
printf '%q' "${1}"
现在如果我们运行它,!
不会被转义,但空格是:
$ ./my-script 'One! Two'
One!\ Two
如果我将脚本更改为/bin/bash
(版本 3.2),它会正确转义!
和 空格。
这是 Zsh 的 bug,还是我遗漏了一些微妙的细节?
看起来它会检查当前的 shell 设置以确定爆炸是否特殊。默认情况下,非交互式 shell 中不启用历史记录扩展,因此它在脚本中并不特殊。
这似乎同样适用于
${(q)var}
参数扩展。老实说,我发现这是一个有点奇怪的选择,因为虽然它意味着输出适合作为同一shell 会话的输入,但它通常不适合作为每个 zsh 会话的输入。无论是否
\!
设置,总是逃避爆炸不会导致任何问题。!
banghist
您可以使用
${(qq)var}
单引号来代替字符串(或${(qqqq)var}
使用$'...'
引号)。然后,爆炸声将与其他一切一起被引用。或者将其变成一个函数: