
愚かな質問ならすみません。同様のことをしようとしていますが、1行だけを使用してください。
$ prog1 | prog2
$ prog1 | prog3
したがって、基本的にprog1を実行し、出力をそれぞれprog2とprog3(チェーンパイプではない)にパイプしたいと思います。私は最初にteeを使ってみましたが、出力をファイルにダンプしたので、うまくいきませんでした(これは私が望むものではありません)。
$ prog1 | tee prog2 | prog3 # doesn't work - creates file "prog2"
ある時点では、出力を2つ以上のプログラムにパイプするためにこれを拡張したいかもしれませんが、今は簡単に始めます。
$ prog1 | prog2
$ prog1 | prog3
$ prog1 | prog4
...
答え1
クラフトの交換。
... | tee >(prog2) | ...
答え2
Ignacioの答えと同様に、一時的な名前付きパイプを使用できますmkfifo(1)
。
mkfifo /tmp/teedoff.$$; cmd | tee /tmp/teedoff.$$ | prog2 & sleep 1; prog3 < /tmp/teedoff.$$; rm /tmp/teedoff.$$
少し冗長ですが、プロセスを交換せずにシステムで動作しますdash
。たとえば、これはsleep 1
競合状態を処理するためのものです。
答え3
小さなユーティリティがありますPTFEそれがすることは:
prog1 | ptee 2 3 4 2> >(prog2) 3> >(prog3) 4> >(prog4)
ファイルに書き込むのではなく、PTFEコマンドラインに与えられたすべてのfdを記録します。
PTFEの一部ですパイプラインアクチュエータ。
答え4
bashismや特殊ファイルなどは必要ありません。とにかくLinuxでは必要ありません。
% { prog1 | tee /dev/fd/3 | prog2 >&2 ; } 3>&1 | prog3
{ { printf %s\\t%s\\t%s\\n \
"this uneven argument list" \
"will wrap around" to \
"different combinations" \
"for each line." "Ill pick out" \
"a few words" "and grep for them from" \
"the same stream." |
tee /dev/fd/3 /dev/fd/4 |
grep combination >&2 ; } 3>&1 |
grep pick >&2 ; } 4>&1 |
grep line
different combinations for each *line.* Ill pick out
different combinations for each line. Ill *pick* out
different *combinations* for each line. Ill pick out
強調表示された結果にアスタリスクが表示され、結果が同じストリームの3つの結果であるだけでなく、別々grep
のプロセス一致結果でもあることがわかります。grep