外部コマンドの実行

back
■ 1. system 関数を使う

system("ls");

次のように、引数を含めて1つの文字列として渡すと、
ワイルドカードを始めとした文字はシェルに解釈される。
コマンドの出力をファイルへリダイレクトしたりする場合はこっち。
system("command $arg $arg");

次のように、引数をリストとして渡すと、シェルは使われない。
* も * としてわたるし、スペースは区切り文字として渡されず、
スペースを含む引数としてコマンドに渡される。
CGI などでは不慮の災害に備えて、リストを使った方がセキュア。
system("command", "$arg", "$arg");

戻り値には、コマンドの終了値が返る。
コマンドの STDIN, STDOUT, STDERR は、(リダイレクトしなければ)呼び出し元のプログラムと共通。


■ 2. back-tick (`) を使う

$return = `command arg`;   $return に command の結果が全て入る
@return = `command arg`;   @return の各要素に、command の結果が1行ずつ入る

command が終了するまで制御が戻らないので注意。
シェルを使うので、ワイルドカードやリダイレクトを使用可能。


■ 3. open 関数を使う

(A) コマンドの STDOUT を受ける
open(FH, "command arg |");
while (<FH>) {
  # "command arg" の出力を1行ずつ扱える
}
close(FH);

(B) コマンドへ STDIN を入力する
open(FH, "| command arg");
print FH "input1";
print FH "input2";
close(FH);

ただし、open(FH, "| command arg |") みたいなことをして読書き両用では
open できない。
これは、IPC::Open2 モジュールを使う。


■ 4. exec 関数を使う

exec("command arg");      # シェルが使われる
exec("command", "arg");   # シェルは使われない

ただし、現在実行中のプロセスは、exec を実行した時点で停止し、command に置き換わる。
その際、PID などが command へ引き継がれる。
ただし、exec によるコマンド実行に失敗した場合は、元のプロセスが継続される。

back