我最近遇到
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
?
我认为潜在的问题是^
文件名中的字符非常有效,因此包含它的模式的含义会根据是否设置该选项而改变:
$ 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
设置,意味着不同的事情。
归档时间: |
|
查看次数: |
6238 次 |
最近记录: |