我最近遇到
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
设置,含义不同。