私の問題はhttps://serverfault.com/questions/171095/how-do-i-join-two-named-pipes-into-single-input-stream-in-linuxしかし、設定はもう少し複雑です。
私は3つのプログラムを持っていますcmd1
。cmd2
cmd3
cmd1
入力を受け付けずに標準出力に書き込みます。
cmd2
stdin または指定されたファイルを読み込み、stdout に書き込みます。
cmd3
2つのファイルを読む
これらのプログラムのデータフローは次のとおりです。cmd2
生成されたデータの使用cmd1
とcmd3
生成されたデータの使用:cmd1
cmd2
cmd1 ---+-----> cmd2 --->
| cmd3
+--------------->
>()、パイプ、および単一のコマンドラインを使用してこのデータフローをどのように実装できますかtee
?
私の推測ではcmd1 | tee >(cmd2) > >(cmd3)
。
答え1
mkfifo thepipe
cmd3 <( cmd1 | tee thepipe ) <( cmd2 thepipe )
これは、名前付きパイプを使用してと間にデータを転送thepipe
します。tee
cmd2
チャートを使用してください:
cmd1 ---(tee)---(thepipe)--- cmd2 --->
| cmd3
+-------------------------->
例は次のとおりです。
cmd1
=echo 'hello world'
、文字列を標準出力に書き込みます。cmd2
=rev
、各行の文字順序を逆に置き換え、ファイルまたは標準入力から読み込みます。cmd3
=はpaste
2つのファイル(この場合)から入力を取得し、2つの列を生成します。
mkfifo thepipe
paste <( echo 'hello world' | tee thepipe ) <( rev thepipe )
結果:
hello world dlrow olleh
同じですが、名前付きパイプをグラフの別の枝に配置します。
cmd1 ---(tee)--------------- cmd2 --->
| cmd3
+-----(thepipe)------------>
cmd3 thepipe <( cmd1 | tee thepipe | cmd2 )
コマンド例の使用:
paste thepipe <( echo 'hello world' | tee thepipe | rev )
これにより、上記と同じ出力が生成されます。
明らかに他の可能性もあります。
cmd1 | tee >( cmd2 >thepipe ) | cmd3 /dev/stdin thepipe
しかし、中間結果を一時ファイルに記録し、2つの命令セットに分割するのが楽しくない場合は、名前付きパイプを使用しない可能性があると思います。