web-dev-qa-db-ja.com

bstでstdoutとstderrの両方を配管していますか?

Bashの新しいバージョンには&>演算子があり、(正しく理解すれば)stdoutとstderrの両方をファイルにリダイレクトするようです(代わりに、Adrianが明らかにしたように、&>>がファイルに追加します)。

同じことを達成する最も簡単な方法は何ですか?代わりに別のコマンドにパイプしますか?

たとえば、次の行では:

cmd-doesnt-respect-difference-between-stdout-and-stderr | grep -i SomeError

Grepがstdoutとstderrの両方のコンテンツで一致するようにしたい(事実上、それらを1つのストリームに結合する)。

:この質問はパイピングについて尋ねている、notリダイレクト-したがって、現在の重複としてマークされている質問の重複ではありません。

131
Andrew Ferrier

&>>fileがファイルに追加することに注意してください&>はリダイレクトし、overwrite既存のファイル。)

stdoutstderrを組み合わせるには、2>&1を使用して後者を前者にリダイレクトします。これにより、stderr(ファイル記述子2)がstdout(ファイル記述子1)にリダイレクトされます。例:

$ { echo "stdout"; echo "stderr" 1>&2; } | grep -v std
stderr
$

stdoutは標準出力に、stderrは標準エラーになります。 grepstdoutのみを見るため、stderrは端末に出力されます。

一方:

$ { echo "stdout"; echo "stderr" 1>&2; } 2>&1 | grep -v std
$

Stdoutとstderrの両方に書き込んだ後、2>&1はstderrをstdoutにリダイレクトし、grepはstdinの両方の文字列を見るため、両方を除外します。

リダイレクトの詳細については、こちらをご覧ください こちら

あなたの例について(POSIX):

cmd-doesnt-respect-difference-between-stdout-and-stderr 2>&1 | grep -i SomeError

または、>=bash-4を使用:

cmd-doesnt-respect-difference-between-stdout-and-stderr |& grep -i SomeError
141

Bashには2>&1 |の省略形、つまり|&があり、stdoutとstderrの両方をパイプします( manual を参照)。

cmd-doesnt-respect-difference-between-stdout-and-stderr |& grep -i SomeError

これはBash 4.0で導入されました。 リリースノート を参照してください。

92
Benjamin W.