man grepページから(Debianの場合):
説明
grep searches the named input FILEs (or standard input if no files are
named, or if a single hyphen-minus (-) is given as file name) for lines
containing a match to the given PATTERN. By default, grep prints the
matching lines.
最初の場合、grepファイルを開きます。第二に、シェルはファイルとの標準入力に割り当て、それを開くgrepと、grep任意のファイル名の引数を渡されていないことは、その標準入力をgrepする必要が想定しています。
1の長所:
grep 複数のファイルをgrepできます¹。
grepの各オカレンスlineが見つかったファイル名を表示できます。
2の長所:
パフォーマンスの観点から、ファイルを開くことができない場合、grepリダイレクトを使用する場合の実行を保存しますが、そうでない場合、grep大きな違いは期待できません。
リダイレクトを使用すると、への追加の引数を渡すために持っセーブgrep、あなたが作るgrepの引数は少し簡単に解析します。一方、シェルには、dup2()ファイル記述子0へのファイル記述子への(少なくとも)追加のシステムコールが必要です。
では{ grep -m1 line; next command; } < file、grep(ここではGNUがgrep)になるでしょうseek()ので、ちょうど一致する行の後に戻ってnext command(それはまた、ファイルがシークであるかどうかを判断する必要があります)、ファイルの残りの部分を見ています。言い換えれば、stdin内の位置はのもう1つgrepの出力です。を使用するとgrep -m1 line file、それを最適化できgrepます。
ノート
¹ではzsh、次のことができます。
grep line < file1 < file2
ただし、これはcat file1 file2 | grep line(catユーティリティを呼び出さずに)同等の処理を行うため、効率が低下します。最初のファイルが改行文字で終了せず、どのファイルでパターンが見つかったかがわからない場合は混乱を招く可能性があります。
²の場合ksh93とbashいえ、などのファイルがある /dev/tcp/host/port(と/dev/fd/xではいくつかのシステムでbash)、リダイレクトのターゲットで使用される代わりに、実際のファイルシステム上のファイルを開くの特別な目的のためにシェルをインターセプト(ただし、一般的に、これらのファイルは、ファイルシステムに存在しない)。によって認識されるの/dev/stdinと同じ目的を果たしますが、少なくともここでは、より適切に名前空間が設定されています(誰でも任意のディレクトリで呼び出されるファイルを作成できますが、管理者のみが呼び出されるファイルを作成できます。-grep-/dev/tcp/host/port