stdoutとstderrの両方をbashでパイピングしていますか?


156

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

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

たとえば、次の行では:

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

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

:この質問は、配管について尋ねているではないリダイレクトする-それはそれは、現在の重複としてマークされています質問の重複しないようにします。


stdoutとstderrの両方をパイプする正しい方法については、リンクされた質問の2番目の回答(stackoverflow.com/a/637834/1129642)を参照してください。別の質問は必要ありません。
Marki555 2016

4
@triplee正確な複製ではありませんか?パイプ対ファイルへのリダイレクト?
ベンジャミンW.

@BenjaminW両方のシナリオを解決する答えが少なくとも1つありますが、受け入れられた答えではありません。これはかなり一般的な質問であるため、より適切な複製を見つけるか、モデレーターにこれらをマージするよう依頼するか、最悪の場合は、このトピックのまったく新しい標準を作成することもできます。より良いだましを見つけたら、ぜひ提案してください。前もって感謝します。
Tripleee

12
@tripleee解決します。ただし|&、どの回答もショートカットを使用していません。これは、「stdoutとstderrの両方をパイプにリダイレクトする」ための最も便利な解決策だと思います。
ベンジャミンW.

3
これはリンクされた質問の複製ではなく、Markoの回答が私が望んだことをしたかどうかは明らかではありませんでした。また、|&については触れていません。再開するための投票。
Martin Bonnerがモニカをサポートする

回答:


163

(以前の既存のファイルをリダイレクトして上書きする間、ファイルに&>>file 追加することに注意してください。)&>

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

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

stdoutstdoutにstderr行き、stderr に行きます。grepを見るだけなstdoutのでstderr、端末に出力します。

一方:

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

stdoutとstderrの両方に書き込んだ後、2>&1stderrを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

の説明に感謝し&>>ます。質問を訂正しました。
Andrew Ferrier

18
私の回答にあなたの例を追加しました。これは、私の与えられた例に基づいて明白でない場合に備えてです。補足として、の|&代わりにbash固有のものを使用することもできます2>&1 |
エイドリアンFrühwirth2013年

13
|&@AdrianFrühwirthが将来の読者のために提案したショートカットについての補足:この機能はbashバージョン4以降でのみサポートされています。3以下を使用している場合は、に固執する必要があります2>&1 |
tomocafe 14

3
Bashのリダイレクトについては、こちらで詳しく説明しています。@AdrianFrühwirthは良い仕事をしました、貼り付けられたリンクはさらに先へ行きます。ときどき、公式のBashのドキュメントがそれでよかったのにと思います。
David Andreoletti、2015年

112

2>&1 |つまり|&、bashはの省略形です。つまり、stdoutとstderrの両方をパイプ処理しますマニュアルを参照)。

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

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


完全を期すためにこれを追加していただきありがとうございます。多くの人がまだ4.0より前のbashを使用しているので、私は他の答えを正しいままにしておきます。しかし、これは便利です。
Andrew Ferrier、2016年

9
最も注目すべきは、macOSに同梱されているBashが古すぎてこれをサポートできないことです。
Flimm 2017年

@Flimmですが、zshはそうではありません
トレントン

1
kshはcoprocに|&を使用するので、これは不要な省略表現としては不適切な選択のようです。重複やリダイレクトのスタックがある行を次の人と同じくらい見るのは嫌いですが、明示的であると言うべきことがいくつかあります。人々がこれを見るのは良いので、私は、実際に役立つ答えを否定することなく、速記に対する嫌悪感を表現したかっただけです。知らなかったので気づいてくれてありがとう。
Paul Hodges

@PaulHodges私はそれがポータブルではないことに同意します-私は主にインタラクティブなBashセッションでそれを使用してタイプしすぎないようにするのが好きです。
Benjamin W.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.