2013-06-24 9 views
8

これは実際の問題を解決するのではなく、仮説的な質問です。teeコマンドの結果を貼り付けます

command1 | tee >(commandA1 | commandA2 >file1) >(commandB1 | commandB2 >file2) >file0 

そうグラフィカル例えばpasteコマンドを使用して、すぐ次

    ---commandA1---commandA2--> file1 
       /
command1---tee-------> file0 
       \ 
        ---commandB1---commandB2--> file2 

ができ行われる。teeコマンドと

は次のように、可能な分割をする複数の異なるストリーム出力であります

paste file1 file2 | command3 

が、再び私は好き、異なるプログラムからペースト出力にリダイレクトすることができます。

paste <(ls) <(ls) | command3 

質問です:

    ---commandA1---commandA2--- 
       /       \ 
command1---tee-------> file0     --- paste---command3 
       \       /
        ---commandB1---commandB2--- 
のようなもの、多少一つに2つのストリームを結合することも可能です

Ps:中間ファイルなしの平均...

+5

ない中間ファイルまたは名前付きパイプなし。 'mkfifo'を参照してください – SheetJS

+3

これは、私が見たいと思っている質問のようなものです。多少、些細なことではありません。 Unfotunately、私は@ Nirkが提案するように "名前付きパイプ"でこれを達成する方法を示すために十分に深くbashを知りません... +1 – kobame

答えて

3

名前付きpで行う方法ですIPE:

trap "rm -f /tmp/file1 /tmp/file2; exit 1" 0 1 2 3 13 15 
mkfifo /tmp/file1 
mkfifo /tmp/file2 
command1 | tee >(commandA1 | commandA2 >/tmp/file1) >(commandB1 | commandB2 >/tmp/file2) >file0 
paste /tmp/file1 /tmp/file2 | command3 
rm -f /tmp/file1 /tmp/file2 
trap 0 

の作業例:

$ cd -- "$(mktemp -d)" 
$ trap "rm -f pipe1 pipe2; exit 1" 0 1 2 3 13 15 
$ mkfifo pipe1 pipe2 
$ printf '%s\n' 'line 1' 'line 2' 'line 3' 'line 4' | tee \ 
>(sed 's/line /l/' | head -n 2 > pipe1) \ 
>(sed 's/line /Line #/' | tail -n 2 > pipe2) \ 
> original.txt 
$ paste pipe1 pipe2 | sed 's/\t/ --- /' 
l1 --- Line #3 
l2 --- Line #4 
$ rm pipe1 pipe2 
$ trap 0 
+0

@JonathanLefflerはそれを書いていませんでした(実際の例を追加する前に) 。 – Barmar

+0

@ l0b0:プロセスが失敗したことを示すトラップ内の「exit 1」。 'exit 0'はプロセスが成功したという誤解を招く印象を与えます。 'exit'を追加しないということは' rm -f'となる最後のコマンドの状態で終了することを意味します。これは成功するので、終了ステータスは0になります。 'trap'は一時的なFIFOシェルがそれらを取り除くことができるときに除去される。 'kill -9'でプロセスを終了すると、クリーンアップすることはできません。しかし、HUP、INT、QUIT、PIPE、TERM(1、2、3、13、15)を使用すると、シェルは終了する前に自身の背後でクリーンアップします。 –

+0

@JonathanLeffler混乱しているのは、トラップする信号のリストに '0'を含めるということです。つまり、通常の終了時に実行され、失敗した終了に変わります。しかし、実際には、最後に 'trap 0'を使って終了時にトラップを無効にするので、元のtrapコマンドにはこの点はありません。 – Barmar

関連する問題