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

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

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

そして

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

後者にはサブディレクトリのファイルが含まれますが、前者はそうではありません。なぜ?

答え1

(アスタリスク*またはアスタリスク)は、通常、コマンドを発行する前にシェルで解釈される特殊文字です。 (通常)前にドットがあるファイル名を除くすべてのファイル名に展開されます。よりパターンマッチングのためのbashマニュアルより多くの情報を知りたいです。

アスタリスクを引用符の中に入れると、シェルはアスタリスクを解釈せずにコマンドにそのまま提供します。


例えば。引用されたものの1つ:

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

ここでは、パラメータを含むgrepオプションを受け取ります。 charで始まる4桁の文字列。この文字列の機能は、完全に次のように異なります。この場合、globと一致するファイルのみが考慮されるという意味です。--include*.pl*grepgrep--include*.pl

私が知っている限り、gnu grepは後でgnu bashと同じパターンマッチライブラリを使用します。これは、表示されているのと同じファイルが含まれることを意味しますecho *.pl

引用しない:

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

*.plここで、シェルはコマンドを実行する前にまずglobを拡張します。 globはallに展開されます.pl

ファイルがあるとしますfoo.pl。 globを展開した後、コマンドラインは次のようになります。bar.plbaz.pl

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

これはパラメータ付きのオプションを受け取り、grepその後にオプションを受け取ります。--includefoo.plbar.plbaz.pl

--include foo.plパターンに一致するファイルのみを考慮するようにgrepに指示しますfoo.pl。パターンにワイルドカードがないので(アスタリスクなし)、一致するファイルはfoo.pl

オプションbar.plbaz.plガイドライン grep もこれらのファイルから検索します。ただし、パターンと一致しないため、前のfoo.plパターンに基づいて無視されます--include

答え2

違いは、パターン()を引用しないと*.plシェルによって拡張されることです。たとえば、grep名前付きファイルを含むディレクトリで実行している場合、foo.plそのファイルは*plシェルによって拡張されるため、grep実際に表示される内容は次のとおりです。

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

そのファイルのみを含めることを指定したので、foo.plそのファイルを1つだけ検索します。

パターンを引用すると、シェルはいいえそれを拡張し、grep正しいコマンドを入手してください。

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

関連情報