回答:
*(スター、またはアスタリスク)は、それがコマンドを与えている前に、(通常は)シェルによって解釈される特殊文字です。(通常)先頭のドットを除くすべてのファイル名に展開されます。詳細については、パターンマッチングに関する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.plgrepはこれらのファイルも検索しますが、パターン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引用符を見ることはありません。