最近知ったのだが、bash 4.0以降ではコプロセス(coprocess)なる機能が追加されているらしい。 名前付きのバックグラウンドジョブみたいなもので、コマンドを指定して起動後、値を渡したら処理した値を後から抜き出す事ができるらしい。 コマンドの機能をデーモン化するようなイメージだろうか?
以下、実際に使ってみた例。 視覚的にわかりやすいよう、awkで頭に文字列を追加するような処理にしている。
# コプロセスの生成
coproc AWK_COPROC { awk '{print "AWK_" $0;fflush()}' ;}
# 値をコプロセスに渡す
echo test >&"${AWK_COPROC[1]}"
# 値をコプロセスから抜き出す
read var <&"${AWK_COPROC[0]}";echo $var
[root@BS-PUB-CENT7-01 ~]# # コプロセスの生成
[root@BS-PUB-CENT7-01 ~]# coproc AWK_COPROC { awk '{print "AWK_" $0;fflush()}' ;}
[1] 17000
[root@BS-PUB-CENT7-01 ~]#
[root@BS-PUB-CENT7-01 ~]# # 値をコプロセスに渡す
[root@BS-PUB-CENT7-01 ~]# echo test >&"${AWK_COPROC[1]}"
[root@BS-PUB-CENT7-01 ~]#
[root@BS-PUB-CENT7-01 ~]# # 値をコプロセスから抜き出す
[root@BS-PUB-CENT7-01 ~]# read var <&"${AWK_COPROC[0]}";echo $var
AWK_test
試してる間に引っかかったのだが、sedなどを使ってみると、値が返ってこない。 これは、コマンドがバッファしてしまってるので読み取りが完了せず、値が返ってこなくなるのが原因のようだ。 coprocでの書き方に工夫が必要になりそうだ。
[root@BS-PUB-CENT7-01 ~]# coproc SED_COPROC { sed 's/$/_TEST/g' ;}
[1] 17072
[root@BS-PUB-CENT7-01 ~]# echo test >&"${SED_COPROC[1]}"
[root@BS-PUB-CENT7-01 ~]# read var <&"${SED_COPROC[0]}";echo $var
←値が返ってこないで待機状態になる
この機能でsedを使う場合は、-uなんかでフラッシュするように指定してやると良いだろう。 使いどころが難しそうな感じだけど、うまく使えれば便利なような…?どうなんだろう。