stdinをstdoutとstderrにフォークしますか?

stdinをstdoutとstderrにフォークしますか?

標準入力をstdoutとstderrに分岐できるかどうか疑問に思います。これらのこと、

$ echo "hi" | fork > std.out 2> std.err
$ cat std.out
hi
$ cat std.err
hi

それとも、入力を2つの異なるターゲットに分岐する機能がありませんか?このteeコマンドは私が望むものに似ているようですが、ファイルに書きたくありません。ありがとうございます。

答え1

私はLinuxの古典的な「すべてがファイルです」を理解する必要がありました。このteeユーティリティは標準入力を標準出力にコピーし、ファイルにコピーします。したがって、stderrが書き込むファイルを識別すると、/dev/stderrstdinを両方のファイルに書き込んで次のようにリダイレクトできます。

$ echo "hi" | tee /dev/stderr > test.out 2> test.err
$ cat test.out
hi
$ cat test.err
hi

答え2

zshから出力用にfdを複数回リダイレクトすると、zshは内部的に分岐するため、次のことができます。

echo hi >&1 >&2

stdoutとstderrに出力します。

test.outただし、これをsumとして出力するには、test.err次のようにします。

echo hi > test.out > test.err

代わりに。

LinuxおよびCygwinベースのシステム以外のシステムでは、次のコマンドを使用して同じことを実行できます。

echo hi | tee /dev/stderr

LinuxとCygwinでは、stderrがパイプやttyで開かない限り、これは間違っています。開く/dev/stderrと、stderr(fd 2)が指すファイルが再び開きます。たとえば、stderrがログファイルにリダイレクトされた場合は、この行を含むログファイルを置き換えますhi。ソケットがソケットに対してstderrを開くと失敗します。開いている

-aのオプションを追加します。)tee追加モード)はログファイルの状況に役立ちます。

プロセス交換サポートを含むシェルを使用する別の回避策は、次の方法を使用することです。

echo hi | tee >(cat >&2)

しかし、ここには独自の問題もあります。たとえば、一部のシェルではbashコマンドcatが待機していないため、次の問題が表示されます。

$ bash -c 'echo hi | tee >(cat >&2); echo after >&2'
hi
after
hi

echo afterどこに走るべきかcatについては前に書いたことがありますhi

関連情報