grep
検索するファイルのリストを指定しないと、grep
ファイル名を指定するよりもはるかに遅いことがわかりました(リストが、*
つまりディレクトリ内のすべてのファイルであるにもかかわらず)。
-R
オプションを使用するときは、これが(grep -R pattern
急速に)起こらないようですgrep -R pattern *
。
grep -R pattern
私は入力ファイルのリストなしで電話をかける悪い習慣に陥りました。今使っていますgrep pattern
が、次のことを知りたいです。
grep -R pattern
コマンドが無効な場合、有効なコマンドを実行するために背後に何が起こりますか?grep pattern
または、言い換えれば、2つの違いは何ですか?
grep -R pattern
grep -R pattern *
grep pattern
答え1
GNUgrep
と他のいくつかの実装には、与えられたファイルとディレクトリを再帰的に検索させるgrep
非標準オプションがあります。-R
grep
コマンドラインで他のファイルやディレクトリを指定せずに使用すると、GNU実装は暗黙的に現在のディレクトリを使用します。-R
grep -R PATTERN
だから
grep -R PATTERN .
grep -R PATTERN *
これは、現在のディレクトリに隠しファイルがない場合、またはでdotglob
シェルオプションを設定したのと同じですbash
。dotglob
でシェルオプションを設定しないと、コマンドラインのパターンは非表示の名前にのみ拡張されますbash
。*
他の実装では、標準入力を再帰的にgrepすることはほとんど意味がないため、これは合理的なデフォルト値のように見えますが、暗黙的にwithを使用しgrep
ません。.
-R
grep
OpenBSDを例にしてみましょう。
$ 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
完全に合理的です。