zsh:总是启用扩展glob有问题吗?

dan*_*451 6 zsh wildcards rc

我最近遇到

setopt extended_glob
Run Code Online (Sandbox Code Playgroud)

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

ls ^foo*
Run Code Online (Sandbox Code Playgroud)

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

我发现一个教程建议将其放入setopt extended_glob您的.zshrc.zsh 文件中,但我想由于许多 zsh 配置模板都忽略了该选项,并且默认情况下禁用了该选项,因此它有一些缺点甚至副作用吗?

或者总是extended_glob通过将它放在一个人的内部来启用它是绝对无害的.zshrc

ilk*_*chu 7

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

$ touch 'foo' 'bar' '^foo' '^bar'
$ ls ^foo*
^foo
$ setopt extendedglob
$ ls ^foo*           
bar  ^bar  ^foo
Run Code Online (Sandbox Code Playgroud)

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

只要您记得启用了哪些选项,即知道 shell 如何解释 globs,extended_glob在交互使用中保持启用应该不是问题。

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


ksh 样式的扩展 glob(@(...|...)setopt kshglob)有一个类似的问题,因为它们与 zsh 处理 glob 中括号的方式相冲突。@(f|b)根据是否kshglob设置,意味着不同的事情。

  • `^` 也经常用在 git 命令中,比如 `git diff HEAD^`,如果你经常使用 git,这使得在 zsh 中使用它很成问题。 (2认同)