1. ホーム
  2. windows

[解決済み] Unix (または Windows) でパイプを使って、1つのプロセスの標準出力を複数のプロセスに送るにはどうしたらいいですか?

2023-06-18 20:32:07

質問

プロセス proc1 の標準出力を 2 つのプロセス proc2 と proc3 にリダイレクトしたいです。

         proc2 -> stdout
       /
 proc1
       \ 
         proc3 -> stdout

私は

 proc1 | (proc2 & proc3)

というのがありますが、うまくいかないようです、つまり

 echo 123 | (tr 1 a & tr 1 b)

は書き込みます。

 b23

の代わりに標準出力に

 a23
 b23

どのように解決するのですか?

<上 編集者コメント :

- >(…) プロセスの置換 というのは 非標準のシェル機能 いくつかの POSIX 互換のシェル。 bash , ksh , zsh .

- この答えは、誤って出力プロセスの代入の出力をパイプラインで送ってしまいます。 : echo 123 | tee >(tr 1 a) | tr 1 b .

- プロセス置換の出力は、予測不可能なインターリーブになります。 zsh の中のコマンドの前にパイプラインが終了する可能性があります。 >(…) を実行します。

unixでは(macでも)、以下のように tee コマンドを使用します。 :

$ echo 123 | tee >(tr 1 a) >(tr 1 b) >/dev/null
b23
a23

通常であれば tee を使って複数のファイルにリダイレクトしていましたが、>(...)を使うことで を使うと、別のプロセスにリダイレクトすることができます。つまり、一般的には

$ proc1 | tee >(proc2) ... >(procN-1) >(procN) >/dev/null

は思い通りになります。

Windowsでは、内蔵のシェルに同等のものはないと思います。マイクロソフトの Windows PowerShell には tee コマンドがありますが。