私の知る限り、teeコマンドを使用して、標準出力を画面とその他のファイルに分割できます。
command -option1 -option2 argument | tee file1 file2 file3
teeを使用してファイルの代わりにコマンドに出力をリダイレクトすることは可能ですか?理論的にはコマンドのチェーンを作成できますか?
私の知る限り、teeコマンドを使用して、標準出力を画面とその他のファイルに分割できます。
command -option1 -option2 argument | tee file1 file2 file3
teeを使用してファイルの代わりにコマンドに出力をリダイレクトすることは可能ですか?理論的にはコマンドのチェーンを作成できますか?
回答:
コマンドラインで名前付きパイプ(http://linux.die.net/man/1/mkfifo)を使用tee
して、名前付きパイプでコマンドを読み取ることができます。
mkfifo /tmp/data0 /tmp/data1 /tmp/data2
cmd0 < /tmp/data0 & cmd1 < /tmp/data1 & cmd2 < /tmp/data2 &
command -option1 -option2 argument | tee /tmp/data0 /tmp/data1 /tmp/data2
場合command
仕上げは、tee
それぞれに(0バイトの読み出し)EOF信号を送る名前付きパイプ、閉じ/tmp/dataN
正常終了であろうがcmdN
プロセス。実際の例:
$ mkfifo /tmp/data0 /tmp/data1 /tmp/data2
$ wc -l < /tmp/data0 & wc -w < /tmp/data1 & wc -c < /tmp/data2 &
$ tee /tmp/data0 /tmp/data1 /tmp/data2 < /etc/passwd >/dev/null
$ 61
1974
37
バックグラウンドプロセスのため、シェルはプログラム出力の前にプロンプトを返しました。3つのインスタンスはすべてwc
正常に終了しました。
私が正しく理解していれば、あなたはに相当するものを探していますがtee file1 file2 file3
、同じデータを3つのファイルfile1
、file2
およびfile3
に書き込むのではなく、同じデータを3つのコマンドcmd1
、cmd2
およびにパイプしたいcmd3
、つまり
… | ??? cmd1 cmd2 cmd3
と同等でなければなりません
… | cmd1 &
… | cmd2 &
… | cmd3 &
ただし、…
実行されるのは1回だけです。
それを行うには2つの方法があります。
Ksh93、bashおよびzshはプロセス置換をサポートします。これは、パイプの一般化であり、コマンドの引数を、書き込み時にデータをコマンドへの入力として渡すファイルにすることができます(コマンドからの出力時にデータを取得する入力バリアントもあります) 。あれは、
echo hello | tee >(cmd1)
プリントhello
標準出力へと加えを実行cmd1
してhello
、入力として。
あなたが入力を複製したいのであれば、たとえば、somecommand
両方にそれを渡すcmd1
とcmd2
、あなたが使用することができます
somecommand | tee >(cmd1) | cmd2
シェルがプロセス置換をサポートしていない場合は、代わりに名前付きパイプを使用できます。それがどのように機能するかについては、Arcegeの回答を参照してください。名前付きパイプは、作成して削除し、プロセスを手動で開始および同期する必要があるため、プロセス置換よりも便利ではありません。すべてのシェルがプロセス置換をサポートしているわけではありませんが、完全に移植可能であるという利点があります。また、プロセス置換の対象となるシナリオ以外のシナリオでも使用できます。
内部では、一部のシステムでは、プロセス置換は名前付きパイプを内部的に使用します。ただし、ほとんどのシステムでは、ファイル記述子を表す名前付きファイルに依存しています。
pee
からも参照してくださいmoreutils
。
誰もpee
moreutils(https://joeyh.name/code/moreutils)からのコマンドに言及していないことに驚いています。