execvもどき

いいか.結論から書くぞ.この糞エントリー読む暇あったらこれを読んどけ

そうですね、execl(3)とかexecv(3)に当たるようなものが無いんですよね。system(3)みたいなものしかありません。僕はC→PerlPHPとやってきたので非常に違和感がありました。

たぶん細かいところは違うけど似た風なもの.

$ php -r 'function execv($cmd, $args, &$stdout = null, &$execResult = null) { $cmd = escapeshellcmd($cmd); $arg_string = implode(" ", array_map("escapeshellarg", $args)); echo "$cmd $arg_string\n"; return exec("$cmd $args", $stdout, $execResult);} execv("echo", array("a", "b", "c"));'
'echo' 'a' 'b' 'c'

ただし問題が.00hな文字が期待通り扱えない? ASCIZだから別にいいのかな.

$ php -r 'function execv($cmd, $args, &$stdout = null, &$execResult = null) { $cmd = escapeshellcmd($cmd); $arg_string = implode(" ", array_map("escapeshellarg", $args)); echo "$cmd $arg_string\n"; return exec("$cmd $args", $stdout, $execResult);} execv("echo", array("a", "b", "c\x00c"));'
'echo' 'a' 'b' 'c'

読めないので改行を入れて関数だけ抜き出してみた.
echoとか本当は要らないし,このノリのものを本当に使いたい人は,escapeshell*()とかも要る要らないとか適当にアレンジしてください.

function execv($cmd, $args, &$stdout = null, &$execResult = null) {
  $cmd = escapeshellcmd($cmd);
  $arg_string = implode(" ", array_map("escapeshellarg", $args));
  echo "$cmd $arg_string\n";
  return exec("$cmd $args", $stdout, $execResult);
}