"grep -R mode"が有効なコマンドではない場合、後で何が起こりますか?

"grep -R mode"が有効なコマンドではない場合、後で何が起こりますか?

grep検索するファイルのリストを指定しないと、grepファイル名を指定するよりもはるかに遅いことがわかりました(リストが、*つまりディレクトリ内のすべてのファイルであるにもかかわらず)。

-Rオプションを使用するときは、これが(grep -R pattern急速に)起こらないようですgrep -R pattern *

grep -R pattern私は入力ファイルのリストなしで電話をかける悪い習慣に陥りました。今使っていますgrep patternが、次のことを知りたいです。

grep -R patternコマンドが無効な場合、有効なコマンドを実行するために背後に何が起こりますか?grep pattern

または、言い換えれば、2つの違いは何ですか?

  1. grep -R pattern
  2. grep -R pattern *
  3. grep pattern

答え1

GNUgrepと他のいくつかの実装には、与えられたファイルとディレクトリを再帰的に検索させるgrep非標準オプションがあります。-R

grepコマンドラインで他のファイルやディレクトリを指定せずに使用すると、GNU実装は暗黙的に現在のディレクトリを使用します。-R

grep -R PATTERN

だから

grep -R PATTERN .

grep -R PATTERN *これは、現在のディレクトリに隠しファイルがない場合、またはでdotglobシェルオプションを設定したのと同じですbashdotglobでシェルオプションを設定しないと、コマンドラインのパターンは非表示の名前にのみ拡張されますbash*

他の実装では、標準入力を再帰的にgrepすることはほとんど意味がないため、これは合理的なデフォルト値のように見えますが、暗黙的にwithを使用しgrepません。.-R

grepOpenBSDを例にしてみましょう。

$ grep -R PATTERN
grep: warning: recursive search of stdin

grep入力ファイルと入力ファイルなしで実行すると、-Rユーティリティは標準入力を読み込みます。すべてのgrep実装がこれを行う理由は次のとおりです。POSIXは、ユーティリティは次のことを行う必要があると言います。

したがって、(完全に有効な)コマンドを実行してください。

grep PATTERN

grepどの入力ファイルも端末の入力を待ちません。を使用して入力終了信号を送信するCtrl+Dか、を使用してプロセスを中断するまで入力を待ちます Ctrl+C

標準入力ストリームから読み取るのと、ディレクトリ構造で一致するパターンを繰り返し検索することは、相互に排他的な操作です。こうしても役に立たない

somecommand | grep -R PATTERN

しかし、

somecommand | grep PATTERN

完全に合理的です。

関連情報