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修飾子には別の構文があります。したがって、zshの主な機能の1つであるglob修飾子を引き続き使用できますが、もっと入力する必要があります。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は、ワイルドカード引数とコマンド置換の結果、およびシェルがパターンを許可する他の場所で使用される「(」、「|」、「)」および「<」の特殊な意味を無効にします。 SH_GLOBが設定されているがKSH_GLOBが設定されていない場合、開いた角かっこの前にスペースはなく、シェルは角かっこ内に含まれるサブシェル式を解釈できます。たとえば(true)は!その後の空間。このオプションは、zsh が sh または ksh で呼び出される場合、デフォルトで設定されます。

関連情報