1. ホーム
  2. bash

[解決済み] 標準出力ではなく標準エラー出力にパイプを通すにはどうしたらいいですか?

2022-03-20 18:45:07

質問

に情報を書き込むプログラムがあります。 stdoutstderr を処理する必要があります。 stderrgrep を残して stdout を脇に置く。

一時ファイルを使えば、2つのステップでできる。

command > /dev/null 2> temp.file
grep 'something' temp.file

しかし、一時ファイルなしで、1つのコマンドとパイプを使って、どのようにこれを実現するのでしょうか?

解決方法は?

まず、標準エラー出力を標準出力(パイプ)にリダイレクトし、次に標準出力から /dev/null (stderrの行き先は変えずに)。

command 2>&1 >/dev/null | grep 'something'

I/Oリダイレクションの詳細については、「I/Oリダイレクション」の章を参照してください。 リダイレクション Bashリファレンスマニュアルに記載されています。

I/Oリダイレクションの順序は左から右へと解釈されますが、パイプはI/Oリダイレクションが解釈される前に設定されていることに注意してください。 1や2などのファイルディスクリプタは、開いているファイル記述への参照である。 操作 2>&1 ファイルディスクリプタ2、別名stderrは、ファイルディスクリプタ1、別名stdoutが現在参照しているのと同じオープンファイルの記述を参照するようになる( dup2() open() ). 操作 >/dev/null のオープンファイル記述を参照するように、ファイル記述子 1 を変更する。 /dev/null しかし、ファイル記述子2が、ファイル記述子1がもともと指していたオープンファイルの記述、つまりパイプを指しているという事実は変わりません。