禁用 zsh 中的 glob 限定符

禁用 zsh 中的 glob 限定符

有没有办法用 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 调用,则默认设置此选项。

相关内容