execvもどき
いいか.結論から書くぞ.この糞エントリー読む暇あったらこれを読んどけ
そうですね、execl(3)とかexecv(3)に当たるようなものが無いんですよね。system(3)みたいなものしかありません。僕はC→Perl→PHPとやってきたので非常に違和感がありました。
たぶん細かいところは違うけど似た風なもの.
$ 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); }