April 27, 2007

Process Substitution

zshやbashにはProcess Substitutionという機能が備わっていて、これを使うことで一時ファイルを経由せずにプロセス間でやりとりできる。

例えば、あるログからgrepで必要な部分だけを取りだし、またもう一方のログからもgrepで必要な部分だけを取り出して、双方のdiffを取る、という処理をする場合に、これまで一時ファイルを作成してdiffを取っていた。ところが

$ diff -u <(grep foo foo.log) <(grep foo bar.log)

これだけでいいらしい。たいへん衝撃的な出来事だった。
裏では何が行われているかというと、それぞれの出力先fdを/proc/self/fd/nとしてdiffに渡している。

ちなみに、>(process)で出力として使える。

$ grep blog.tagoh.jp /var/log/apache2/access.log | tee >(grep -E '(google|yahoo)' > foo) | grep -v -E '(google|yahoo)' > bar

まあこんなことは普段しないし、しようとも思わないんだけど、出力を何種類かにわけて異なる処理をしたい場合に便利かもしれない。

No comments: