83

プロセス proc1 の stdout を 2 つのプロセス proc2 と proc3 にリダイレクトしたいと思います。

         proc2 -> stdout
       /
 proc1
       \ 
         proc3 -> stdout

私は試した

 proc1 | (proc2 & proc3)

しかし、うまくいかないようです。

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

書く

 b23

の代わりに stdout に

 a23
 b23
4

6 に答える 6

130

編集者注:
->(…)一部のPOSIX 互換シェルの非標準シェル機能であるプロセス置換です: , , . - この回答は、出力プロセス置換の出力をパイプライン経由で誤って送信します: . - プロセス置換からの出力は予期せずインターリーブされ、 を除き、内部のコマンドが終了する前にパイプラインが終了する場合があります。bashkshzsh
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 では、組み込みのシェルに相当するものはないと思います。ただし、 Microsoft のWindows PowerShellにはteeコマンドがあります。

于 2008-09-13T22:37:53.527 に答える
22
于 2008-10-10T10:43:40.147 に答える
5

@dF: が PowerShell にはティーがあると述べたので、PowerShell でこれを行う方法を示したいと思いました。

PS > "123" | % { 
    $_.Replace( "1", "a"), 
    $_.Replace( "2", "b" ) 
}

a23
1b3

最初のコマンドから出てくる各オブジェクトは、次のオブジェクトが作成される前に処理されることに注意してください。これにより、非常に大きな入力へのスケーリングが可能になります。

于 2008-09-14T23:16:45.080 に答える