bash4.0以降で追加されたコプロセス(coprocess)を使ってみる

最近知ったのだが、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
Sponsored Links

試してる間に引っかかったのだが、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なんかでフラッシュするように指定してやると良いだろう。
使いどころが難しそうな感じだけど、うまく使えれば便利なような…?どうなんだろう。

 

【参考】

 


Written by blacknon

インフラ系のSE。一時期はプログラマ。 仮想化とオープンソースに興味あり。一日中寝てたい今日このごろ。 スペインとかで働きたいなぁ…(シエスタがあるので)

Leave a Comment

メールアドレスが公開されることはありません。

*