*
他のglobパターンは、現在の作業ディレクトリに基づくパス名拡張を介して単語に変換されることがわかります。ただし、一部のコマンドでは、ファイルではなくパラメーターにこれを使用するようです。たとえば、私はプログラムが拡張前にdpkg -l pkg-*
引数pkg-
を見ることができず、拡張後にのみ見ることができると思いました。そうではありませんか?どのように動作しますか?
私は最近、著者が呼ぶ奇妙なバッシュについて読んだ。魔法のエイリアス私の考えでは、これを行うために使用できるようです。
答え1
問題は、pkg-*
現在のディレクトリのファイルと一致しない場合は、そのままdpkgに渡されることです。これは本当に悪い考えです。人々は常にそれを引用しなければなりません。たとえば、dpkg -l pkg-\*
答え2
あなたは正しいです。プログラムはシェル拡張引数のみを表示でき、元のワイルドカードは表示できません。ただし、Bourne シェルとそれ以降の項目 (ksh、bash、dash など) は、0 個のファイルと一致する場合はワイルドカードを拡張しません。したがって、pkg-
現在のディレクトリに名前が始まるファイルがない場合、およびdpkg -l pkg*
パラメータはに渡されます。-l
pkg-*
dpkg
これは、ファイル名として解釈されず、ファイル名と一致しない単語にワイルドカード文字を引用しないように便利です。ただし、一部のシェルは動作が異なり、ワイルドカードが何も一致しない場合はコマンドを中断する可能性があります(csh、tcsh、zsh、およびFishのデフォルト動作 - 複数の連続パターンがない限り、その一部は内容と同じように何も一致しません。なし)。ファイルの1つが一致する)または拡張ワイルドカード一致(zshのN
glob修飾子またはnull_glob
シェルオプション、N
kshのパターンオプション、nullglob
bashのシェルオプション)。後者の動作は、規則性(一致しないパターンが1つ以上のファイルと一致するパターンと同じように一致リストに拡張されている)という利点があり、スクリプトでより多く使用されます。
パターンが予期せず拡張されないようにするには、ワイルドカード文字(dpkg -l 'pkg-*'
または)を引用してくださいdpkg -l pkg-\*
。
一般的に使用されるシェルは、どのコマンドのパラメータがファイルであるか(ワイルドカードが必要です)、どのパラメータが単独で残されるのが最善かを知りません。 Zshは、特定のコマンドの前にワイルドカードを作成して、そのコマンドのnoglob
ワイルドカードを無効にすることができます(たとえば、noglob dpkg -l pkg-*
.noglob
別名によく使用されますalias lynx='noglob lynx'
。noglob