zsh:始终启用扩展 glob 有问题吗?

zsh:始终启用扩展 glob 有问题吗?

我最近遇到

setopt extended_glob

...为了启用扩展通配符,允许添加许多很酷的通配符,例如排除特定模式,例如:

ls ^foo*

...将ls在当前目录中的每个路径上使用,除了匹配的模式foo*

我发现一个教程建议放入setopt extended_glob你的.zshrc,但我猜因为许多 zsh 配置模板错过了该选项,并且该选项是默认禁用它有一些缺点甚至副作用吗?

extended_glob或者总是通过将其放入一个中来启用它是绝对无害的吗.zshrc

答案1

我认为潜在的问题是,这^是文件名中相当有效的字符,因此包含它的模式的含义会根据是否设置了该选项而变化:

$ touch 'foo' 'bar' '^foo' '^bar'
$ ls ^foo*
^foo
$ setopt extendedglob
$ ls ^foo*           
bar  ^bar  ^foo

标准 shell 会将 视为^普通字符,因此为了兼容性,该功能可能默认被禁用。

只要您记住启用了哪些选项,即知道 shell 如何解释 glob,extended_glob在交互式使用中保持启用状态应该不会成为问题。

对于不期望它但使用奇怪的文件名的脚本,这将是一个问题,但非交互式 shell 不应该读取.zshrc,因此将其设置在那里应该可以。只是不要将其设置为.zshenv.


ksh 风格的扩展 glob(@(...|...)等等setopt kshglob)也有类似的问题,因为它们与 zsh 处理 glob 中括号的方式相冲突。@(f|b)根据是否kshglob设置,含义不同。

相关内容