stdout
およびに情報を書き込むプログラムがありstderr
、 を除いた で を処理する必要がありstderr
ます。grep
stdout
一時ファイルを使用すると、次の 2 つの手順で実行できます。
command > /dev/null 2> temp.file
grep 'something' temp.file
しかし、一時ファイルを使わずに、1 つのコマンドとパイプを使用してこれを実現するにはどうすればよいでしょうか?
ベストアンサー1
まず、stderr を stdout (パイプ) にリダイレクトします。次に、stdout を/dev/null
(stderr の送信先を変更せずに) にリダイレクトします。
command 2>&1 >/dev/null | grep 'something'
I/Oリダイレクトの詳細については、リダイレクトBash リファレンス マニュアルを参照してください。
I/Oリダイレクトのシーケンスは左から右に解釈されますが、パイプはI/Oリダイレクトが解釈される前にセットアップされることに注意してください。1や2などのファイル記述子は、開いているファイルの説明への参照です。この操作により、2>&1
ファイル記述子2(別名stderr)は、ファイル記述子1(別名stdout)が現在参照しているのと同じ開いているファイルの説明を参照するようになります(dup2()
そしてopen()
)。>/dev/null
次に、この操作により、ファイル記述子 1 が のオープン ファイル記述を参照するように変更されます/dev/null
が、ファイル記述子 2 が、ファイル記述子 1 が元々指していたオープン ファイル記述、つまりパイプを参照するという事実は変わりません。