PHPやPerlからbashのプロセス置換を使う方法

こんばんは、ころすけ(@wg_koro)です。

キーボード打鍵

最近、bashの「プロセス置換」が面白いなぁ、とよく遊んでます。

プロセス置換とは

コマンドの結果をファイルとして扱ったり、出力先をコマンドとして扱ったりできます。
参考:漢のzsh (12) 一時ファイルはもういらない – プロセス置換 | マイナビニュース

まぁもっぱら便利なのは前者。こいつが非情に便利。例えば、下記のようなテキスト(list.csv)があったとして。

[text title=”list.csv”]
id1,あべし
id2,ぶべらっ
id3,ぽぅ
[/text]

1列目の「idXX」で target.txt を検索したいとします。

[text title=”target.txt”]
20130909,2055,id1
20130909,1932,id1
20130909,1811,id4
[/text]

まぁ…この程度ならやりようは色々あると思いますが、これをプロセス置換を使って解いてみます。

[text]
grep -f <(cut -d, f1 list.csv) target.txt

出力結果:
20130909,2055,id1
20130909,1932,id1
[/text]

「<()」で囲った部分がプロセス置換です。「cut -d, -f1 list.csv」の結果をファイルとして利用してくれるんですね。一時ファイルが不要なので超便利。

スクリプトの中から使ってみたい

さて、こいつをスクリプト(PHP, Perl)の中から使ってみようと思ったら動かない。あれー?とりあえずPHPで書いてみる。

[php]
$cmd = "grep -f <(cut -d, f1 list.csv) target.txt";
exec($cmd, $res, $return_val);

var_dump($cmd);
var_dump($res);
var_dump($return_val);
[/php]

これを実行すると、$return_valが「2」となって正常に実行されない。はて。

…ああ、もしかして明示的にbash指定してやらないとダメなのか?

[php]
$cmd = ‘bash -c "grep -f <(cut -d, f1 list.csv) target.txt"’;
exec($cmd, $res, $return_val);

var_dump($cmd);
var_dump($res);
var_dump($return_val);
[/php]

実行結果

[text]
string(52) "bash -c "grep -f <(cut -d, -f1 list.csv) target.txt""
array(2) {
[0]=>
string(17) "20130909,2055,id1"
[1]=>
string(17) "20130909,1932,id1"
}
int(0)
[/text]

よしよし、ビンゴ。

スクリプトの中から使うことは滅多にないでしょうけど、場合によっては便利なので覚えておくといいかもです。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください