5

在Zsh 5.9中,我们可以使用打印要对字符串进行shell转义:

$printf“%q”一个!两个'一个\!\两个

这将生成正确的输出!和空间。现在让我们将其作为脚本:

#!/箱子/zsh打印“%q”“${1}”

现在如果我们运行它!转义,但空格是:

$ ./我的脚本'一!两个'一个!\两个

如果我将脚本更改为/垃圾桶/垃圾桶(版本3.2),它正确地转义了!和空间。

这是一个Zsh错误,还是我遗漏了一些微妙的细节?

1答案1

重置为默认值
9

看起来它会检查当前的shell设置以确定bang是否特殊。在非交互式shell中,默认情况下不会启用历史扩展,因此它在脚本中并不特殊。

%(setopt banghist;printf“%q\n”“一!二”)一个\!\两个%(setopt nobanghist;printf“%q\n”“一!二”)一个!\两个

这似乎也适用于${(q)var}参数展开。

老实说,我发现这个选择有点奇怪,因为它意味着输出适合作为相同的shell会话,它通常不适合作为每个zsh会话的输入。总是逃避责任不应该引起任何问题,因为\!给出了一个!无论是否孟加拉语已设置。

你可以使用${(qq)变量}而是用单引号将字符串(或${(qqqq)变量}使用$'...'引号)。然后,砰的一声就会和其他的一切一起被引用。或使其成为函数:

%printq(){printf“%s\n”“${(qq)1}”}%printq one\!“一个!两个
8
  • 请注意qqq(质量)它使用双引号,! 必须在下列情况下逃脱孟加拉语已启用,并且不能在没有的情况下被逃脱,所以zsh在这种情况下没有选择。然后,坚持这样做才有意义。还要注意rcquotes(引用)选项会影响报价。 5月17日18:48
  • @StéphaneChazelas,好吧,这是真的,尽管IMO认为这只是一个不太坚持只使用双引号的理由。。。qqq(质量)可能会转弯!进入之内"\!",类似于如何qq(质量)处理单个报价。而且不管rcquotes(引用),'\''看起来很管用。(以比rc样式更丑为代价。) 5月17日19:01
  • 这就是重点,如果孟加拉语未启用,扩展到"\!"将是错误的作为"\!"\!禁用banghist时。输出的报价呸!酒吧有无都有效孟加拉语,必须是这样的“foo”\!“酒吧”. 5月18日8:35
  • @是的,正是圣菲哈泽拉斯。 5月18日8:38
  • 另一方面,请注意=在领先位置被转义(用(q))即使等于选项被关闭,该选项是对执行相同操作的参数!。与相同^具有加长型吊球(也用于历史替换) 5月18日8:38

你必须登录来回答这个问题。

不是你想要的答案吗?浏览标记的其他问题.