回答:
*
(スター、またはアスタリスク)は、それがコマンドを与えている前に、(通常は)シェルによって解釈される特殊文字です。(通常)先頭のドットを除くすべてのファイル名に展開されます。詳細については、パターンマッチングに関するbashのマニュアルを参照してください。
引用符で囲まれている場合、スターはシェルによって解釈されず、コマンドにそのまま与えられます。
例を説明しました。引用されたもの:
grep "string" . -r --include "*.pl"
ここでgrep
オプションを受け取ります--include
引数で*.pl
。これは、*
文字を最初の文字とする4文字のストリングです。grep
その文字列で何をするかは完全に次第grep
です。この場合--include
、パターンに一致するファイルのみを考慮することを意味します*.pl
。
舞台裏でのAFAIK gnu grepは、gnu bashと同じパターンマッチングlibを使用します。
引用されていないもの:
grep "string" . -r --include *.pl
ここで、シェルは最初にパターン*.pl
をで終わるすべてのファイル名に展開し.pl
ます。とファイルfoo.pl
があるbar.pl
としbaz.pl
ます。コマンドラインを展開すると、次のようになります。
grep "string" . -r --include foo.pl bar.pl baz.pl
ここでgrep
オプションを受け取る--include
引数でfoo.pl
オプションが続く、bar.pl
とbaz.pl
。--include foo.pl
パターンに一致するファイルのみを考慮することを意味しますfoo.pl
。パターンにはワイルドカードがないので、という名前のファイルだけが一致するファイルに一致しますfoo.pl
。
オプションbar.pl
とbaz.pl
grepはこれらのファイルも検索しますが、パターンfoo.pl
と一致しないため無視されます。
grep -r
一貫性がないように見えるのかといつも疑問に思いましたが、それを使用したときだけであることに気づきませんでした*
。
違いは、パターン(*.pl
)を引用符で囲まないと、シェルによって展開されることです。たとえば、grep
というファイルが含まれているディレクトリでを実行するとfoo.pl
、*pl
はシェルによって展開されるため、grep
実際には次のようになります。
grep "string" . -r --include foo.pl
含めるように指示するとfoo.pl
、その1つのファイルのみが検索されます。
パターンを引用すると、シェルはそれを展開せずgrep
、正しいコマンド、つまり
grep "string" . -r --include *pl
peopl
によって展開されません*.pl
。
grep
。シェルにあります。grep
引用符を見ることはありません。