Bashの新しいバージョンには&>
演算子があり、(正しく理解すれば)stdoutとstderrの両方をファイルにリダイレクトするようです(代わりに、Adrianが明らかにしたように、&>>
がファイルに追加します)。
同じことを達成する最も簡単な方法は何ですか?代わりに別のコマンドにパイプしますか?
たとえば、次の行では:
cmd-doesnt-respect-difference-between-stdout-and-stderr | grep -i SomeError
Grepがstdoutとstderrの両方のコンテンツで一致するようにしたい(事実上、それらを1つのストリームに結合する)。
注:この質問はパイピングについて尋ねている、notリダイレクト-したがって、現在の重複としてマークされている質問の重複ではありません。
(&>>file
がファイルに追加することに注意してください&>
はリダイレクトし、overwrite既存のファイル。)
stdout
とstderr
を組み合わせるには、2>&1
を使用して後者を前者にリダイレクトします。これにより、stderr(ファイル記述子2)がstdout(ファイル記述子1)にリダイレクトされます。例:
$ { echo "stdout"; echo "stderr" 1>&2; } | grep -v std
stderr
$
stdout
は標準出力に、stderr
は標準エラーになります。 grep
はstdout
のみを見るため、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