有没有办法用 zsh 禁用 glob 限定符?这似乎是一个有用的功能,但它妨碍了正常的括号。
我用来ag
搜索文件,并ag mymethod(param)
导致 zsh 抱怨missing end of name
,我宁愿不必引用我的论点。由于我从来没有真正使用过 glob 限定符,所以我想我应该禁用它们,但我的谷歌搜索没有出现任何结果。
答案1
您可以通过取消设置来禁用语法PATTERN(QUALIFIERS)
bare_glob_qual
选项:
setopt no_bare_glob_qual
如果选项extended_glob
已设置(并且您应该设置它,不设置它的唯一原因是为了向后兼容使用不寻常语法的罕见脚本),那么 glob 限定符还有另一种语法:。因此,您仍然可以使用 glob 限定符,这是 zsh 的杀手级功能之一,但您必须输入更多内容。PATTERN(#qQUALIFIERS)
Zsh 允许您完全禁用通配符扩展(通配符),这看起来对您来说是更好的选择。如果命令以 为前缀noglob
,则不会对其参数执行通配操作。例如,为了能够键入包含?
作为参数的URL wget
,我有alias wget='noglob wget'
.如果设置了alias ag='noglob ag'
,就可以打字了ag mymethod(param)
。
如果ag
同时使用搜索模式和文件名作为参数,则禁用通配符并不好。如果您能够解析 的参数ag
,那么您可以对它们执行通配符扩展。我不知道 的语法ag
,所以我将给出一个示例,其中我假设ag
仅采用不带参数的选项,并且其第一个非选项参数是模式,其余的是文件。
ag () {
local i=1
while [[ ${(P)i} = -* ]]; do ((++i)); done
if ((i < $#)); then
set -- "${(@)@[1,$i]}" $~@[$((i+1)),$#]
fi
}
alias ag='noglob ag'
答案2
设置SH_GLOB
选项。
setopt sh_glob
从man zshoptions
:
SH_GLOB 禁用“(”、“|”、“)”和“<”的特殊含义,用于通配参数和命令替换的结果,以及 shell 接受模式的其他一些地方。如果设置了 SH_GLOB 但未设置 KSH_GLOB,则在某些情况下,左括号之前没有空格,shell 允许解释括在括号中的子 shell 表达式,例如 !(true) 会被解释为 ! 后面有空格。如果 zsh 作为 sh 或 ksh 调用,则默认设置此选项。