違いは何ですか:
grep "string" . -r --include *.pl
そして
grep "string" . -r --include "*.pl"
後者にはサブディレクトリのファイルが含まれますが、前者はそうではありません。なぜ?
答え1
(アスタリスク*
またはアスタリスク)は、通常、コマンドを発行する前にシェルで解釈される特殊文字です。 (通常)前にドットがあるファイル名を除くすべてのファイル名に展開されます。よりパターンマッチングのためのbashマニュアルより多くの情報を知りたいです。
アスタリスクを引用符の中に入れると、シェルはアスタリスクを解釈せずにコマンドにそのまま提供します。
例えば。引用されたものの1つ:
grep "string" . -r --include "*.pl"
ここでは、パラメータを含むgrep
オプションを受け取ります。 charで始まる4桁の文字列。この文字列の機能は、完全に次のように異なります。この場合、globと一致するファイルのみが考慮されるという意味です。--include
*.pl
*
grep
grep
--include
*.pl
私が知っている限り、gnu grepは後でgnu bashと同じパターンマッチライブラリを使用します。これは、表示されているのと同じファイルが含まれることを意味しますecho *.pl
。
引用しない:
grep "string" . -r --include *.pl
*.pl
ここで、シェルはコマンドを実行する前にまずglobを拡張します。 globはallに展開されます.pl
。
ファイルがあるとしますfoo.pl
。 globを展開した後、コマンドラインは次のようになります。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
パターンに一致するファイルのみを考慮するようにgrepに指示しますfoo.pl
。パターンにワイルドカードがないので(アスタリスクなし)、一致するファイルはfoo.pl
。
オプションbar.pl
とbaz.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