Linuxで名前付きパイプを使用して出力を分割して再接続する

Linuxで名前付きパイプを使用して出力を分割して再接続する

私の問題はhttps://serverfault.com/questions/171095/how-do-i-join-two-named-pipes-into-single-input-stream-in-linuxしかし、設定はもう少し複雑です。

私は3つのプログラムを持っていますcmd1cmd2cmd3

cmd1入力を受け付けずに標準出力に書き込みます。

cmd2stdin または指定されたファイルを読み込み、stdout に書き込みます。

cmd32つのファイルを読む

これらのプログラムのデータフローは次のとおりです。cmd2生成されたデータの使用cmd1cmd3生成されたデータの使用:cmd1cmd2

cmd1 ---+-----> cmd2 --->
        |                  cmd3
        +---------------> 

>()、パイプ、および単一のコマンドラインを使用してこのデータフローをどのように実装できますかtee

私の推測ではcmd1 | tee >(cmd2) > >(cmd3)

ベストアンサー1

mkfifo thepipe
cmd3 <( cmd1 | tee thepipe ) <( cmd2 thepipe )

これは、名前付きパイプを使用してと間にデータを転送thepipeします。teecmd2

チャートを使用してください:

cmd1 ---(tee)---(thepipe)--- cmd2 --->
          |                            cmd3
          +-------------------------->

例は次のとおりです。

  • cmd1= echo 'hello world'、文字列を標準出力に書き込みます。
  • cmd2= rev、各行の文字順序を逆に置き換え、ファイルまたは標準入力から読み込みます。
  • cmd3=はpaste2つのファイル(この場合)から入力を取得し、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つの命令セットに分割するのが楽しくない場合は、名前付きパイプを使用しない可能性があると思います。

おすすめ記事