grepの「* .pl」と* .plの違いは何ですか?引用すると結果が変わるのはなぜですか?


10

違いは何ですか:
grep "string" . -r --include *.pl

そして

grep "string" . -r --include "*.pl"

後者にはサブディレクトリ内のファイルが含まれますが、前者には含まれません。どうして?


違いはありませんgrep。シェルにあります。 grep引用符を見ることはありません。
ワイルドカード2017年

回答:


17

*(スター、またはアスタリスク)は、それがコマンドを与えている前に、(通常は)シェルによって解釈される特殊文字です。(通常)先頭のドットを除くすべてのファイル名に展開されます。詳細については、パターンマッチングに関する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.plbaz.pl--include foo.plパターンに一致するファイルのみを考慮することを意味しますfoo.pl。パターンにはワイルドカードがないので、という名前のファイルだけが一致するファイルに一致しますfoo.pl

オプションbar.plbaz.plgrepはこれらのファイルも検索しますが、パターンfoo.plと一致しないため無視されます。


これは素晴らしい観察です。なぜgrep -r一貫性がないように見えるのかといつも疑問に思いましたが、それを使用したときだけであることに気づきませんでした*
j883376 2013

6

違いは、パターン(*.pl)を引用符で囲まないと、シェルによって展開されることです。たとえば、grepというファイルが含まれているディレクトリでを実行するとfoo.pl*plはシェルによって展開されるため、grep実際には次のようになります。

grep "string" . -r --include foo.pl

含めるように指示するとfoo.pl、その1つのファイルのみが検索されます。

パターンを引用すると、シェルはそれを展開せgrep、正しいコマンド、つまり

 grep "string" . -r --include *pl

peoplによって展開されません*.pl
unxnut 2013

@unxnut良い点、回答を編集。
terdon
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.