STDERRの配管とSTDOUT


24

" Linux:The Complete Reference 6th Edition "(pg。44)によれば、リダイレクトシンボルを使用してSTDERR のみをパイプできます|&

これをテストするための非常に単純なスクリプトを作成しました。

#!/bin/bash
echo "Normal Text."
echo "Error Text." >&2

このスクリプトを次のように実行します。

./script.sh |& sed 's:^:\t:'

おそらく、STDERRに出力された行だけがインデントされます。ただし、実際には次のように機能しません。

    Normal Text.
    Error Text. 

ここで何が間違っていますか?

回答:


26

あなたの本がどのテキストを使用しているのかわかりませんが、bashのマニュアルは明確です(すでにリダイレクトに少し慣れている場合):

|&を使用した場合、command1の標準エラーは、標準出力に加えて、パイプを介してcommand2の標準入力に接続されます。それは略記です2>&1 |。この標準エラーの標準出力への暗黙的なリダイレクトは、コマンドで指定されたリダイレクトの後に実行されます。

そのため、標準出力と標準エラーを混在させたくない場合は、標準出力を別の場所にリダイレクトする必要があります。標準エラーストリーム(stderr)をgrepする方法を参照してください

{ ./script.sh 2>&1 >&3 | sed 's:^:\t:'; } 3>&1

両方が1と3をfdとscript.shし、sed但し、元の標準出力先を指します。善良な市民になりたい場合は、これらのコマンドが必要としないfd 3を閉じることができます。

{ ./script.sh 2>&1 >&3 3>&- | sed 's:^:\t:' 3>&-; } 3>&1

bashそして、ksh93凝縮できる>&3 3>&-まで>&3-(FD移動)。


bashのマニュアルは、私には完全には明らかではありません。なめらかように、なぜ私はかなり理解していない./script.sh > /tmp/stdout_goes_here |& grep 'grepping_script_stderr'仕事をしないことを目的として、すなわち:リダイレクトscript.shさんstdout(、最初に起こるべきマニュアルの抜粋によるもの)、その後、許可するgrepスクリプトのを処理しますstderr。代わりにstderr、tdout`の両方が最終的にstdout_goes_here
sxc731

1
@ sxc731 |&はの短縮形です2>&1 |。その>/tmp/stdout_goes_here |&ため/tmp/stdout_goes_here、stdoutをにリダイレクトし、その後2>&1stderrをstdoutの行き先、つまりにリダイレクトします。コマンドの出力がリダイレクトされたため、/tmp/stdout_goes_here最終的に|入力を受け取りません。ファイルディスクリプター1が最終的に行く場所ではなく、ファイルディスクリプター1が現在行く場所に>&1リダイレクトすることに注意しください。stderrのみをパイプし、stdoutをファイルにリダイレクトするには、1つの方法があります。2>&1 >/tmp/stdout_goes_here |
ジル「SO-悪であるのをやめる」

6

|&パイプのようにstderrをstdinにパイプする2>&1 |ので、次のプログラムは両方をstdinで取得します。

$cat test.sh
#!/bin/bash
echo "Normal Text."
echo "Error Text." >&2
$./test.sh | sed 's:^:\t:'
Error Text.
        Normal Text.
$ ./test.sh |& sed 's:^:\t:'
        Normal Text.
        Error Text.

ああ、それは基本的に長い表現と同等runcommand 2>&1 | teeですか?すなわちruncommand |& tee
ナフトゥリケイ

はい、彼らは同じです。
ケビン

1

|&bashのは(とてつもなく移植性のない)のショートカットであるため2>&1 |、すべての行がインデントされていることがわかります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.