コマンド実行結果の差分を取りたい場合など、
複数のパイプ処理をしたい場合、bash の < ( ... ) 構文を使うと便利です。
command < ( piped-command1 ) <(piped-command2 ) ...
例:
$ cat < (echo hello) <(echo world)
hello
world
ゴミ(一時ファイル)も作成されないのでエコロジーです。
例2: SJIS で書かれたテキストと UTF-8 で書かれたテキストを nkf で SJIS に統一して比較する。
$ diff $(nkf -Se index.shift_jis.html ) $(nkf -We index.utf8.html )
PHP で別々に処理した画像を imagemagick で結合する、という時や複数サーバから httpd ログファイルを拾ってきてマージする、なんていうときにも重宝します。
内部的にはファイルデスクリプタや FIFO を一時作成しています。
open(2) で開くことができるのでファイルを引数にとるプログラムなら大抵のもので使えますね。
検証:
Linux 2.6 の場合の実体はファイルデスクリプタ
$ ls -ld < ( echo foo )
lr-x—— 1 user user 64 8月 6 18:42 /dev/fd/63 -> pipe:[61042111]
FreeBSD 6 の場合は fifo (参考 mkfifo)
$ ls -ld < (echo foo)
prw——- 1 user wheel 0 8 6 19:04 /var/tmp//sh-np-2875720493
参考:
– Can process substitution be used as an input file to another program?(The UNIX and Linux Forums)
zsh では =( … ) とのこと。
% cat =(echo hello)
みたいなかんじで。
– 一時ファイルを作らずにプログラムの出力を diff
diff の利用例。
– Manpage of BASH