Perlのsystem()の引数についてのメモ。2005年5月14日に書き留めておいたもの。
Perlのsystem()は
- リストだと、そのまま execvp() に渡される
- スカラーだと、/bin/sh -c に渡される
こんな仕様になっている。でも、意外と知られていないらしい。system() に安易にスカラーを渡すとメタキャラクターが変に展開されてしまい、セキュリティホールになるので注意(…つまり私も昔やってしまったことがある)。
環境変数は@ENVを使えば取れる。ファイル名のワイルドカードを展開したい場合はFile::Globがあればたいていは事足りるはず。この手のことをするためにsystem()を使わないこと。
以下は例。
リスト
list.pl
system("ls","/etc/*");
h12o@exegesis:~$ perl list.pl
ls: /etc/*: No such file or directory
h12o@exegesis:~$
スカラー
scalar.pl
system("ls /etc/*");
h12o@exegesis:~$ perl scalar.pl
/etc/AFP.conf
…
h12o@exegesis:~$