1. ホーム
  2. bash

[解決済み】bashでstdoutとstderrの両方をパイピングする?

2022-04-15 14:10:38

質問

新しいバージョンのbashには &> 演算子は、(私が正しく理解していれば)標準出力と標準エラー出力両方をファイルにリダイレクトします ( &>> は、Adrianが明らかにしたように、代わりにファイルに追加します)。

同じことを実現するために、代わりに別のコマンドにパイプを通す一番簡単な方法は何ですか?

例えば、この行の場合。

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

stdoutとstderrの両方の内容でgrepがマッチするようにしたい(事実上、1つのストリームに統合されている)。

備考 : この質問は、パイピングについて聞いています。 ではなく リダイレクトしているため、現在重複とマークされている質問と重複していません。

解決方法は?

(ただし &>>file を追加します。 をファイルに追加し、一方 &> はリダイレクトし オーバーライト を作成します)。

組み合わせるには stdoutstderr を使うと、後者を前者にリダイレクトすることができます。 2>&1 . これは、例えば、stderr(ファイル記述子2)をstdout(ファイル記述子1)にリダイレクトするものです。

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

stdout がstdoutに出力されます。 stderr は標準エラー出力になります。 grep を見るだけです。 stdout 従って stderr が端末に表示されます。

一方

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

stdoutとstderrの両方に書き込んだ後。 2>&1 は標準エラー出力を標準エラー出力にリダイレクトし grep は両方の文字列を標準入力で見ているため、両方をフィルタリングする。

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

例題(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