標準入力を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/stderr
stdinを両方のファイルに書き込んで次のようにリダイレクトできます。
$ 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
。