私は違いを理解するのに苦労していますshell_exec()
とexec()
...
私はいつもexec()
サーバー側のコマンドを実行するために使用してきましたが、いつ使用しますshell_exec()
か?
のshell_exec()
省略形exec()
ですか?パラメータが少ない同じことのようです。
私は違いを理解するのに苦労していますshell_exec()
とexec()
...
私はいつもexec()
サーバー側のコマンドを実行するために使用してきましたが、いつ使用しますshell_exec()
か?
のshell_exec()
省略形exec()
ですか?パラメータが少ない同じことのようです。
回答:
shell_exec
すべての出力ストリームを文字列として返します。exec
デフォルトでは出力の最終行を返しますが、すべての出力を2番目のパラメーターとして指定された配列として提供できます。
見る
exec()
shell_exec()
、どちらが適切かを確認する必要があります。」
ここに違いがあります。最後の改行に注意してください。
> shell_exec('date')
string(29) "Wed Mar 6 14:18:08 PST 2013\n"
> exec('date')
string(28) "Wed Mar 6 14:18:12 PST 2013"
> shell_exec('whoami')
string(9) "mark\n"
> exec('whoami')
string(8) "mark"
> shell_exec('ifconfig')
string(1244) "eth0 Link encap:Ethernet HWaddr 10:bf:44:44:22:33 \n inet addr:192.168.0.90 Bcast:192.168.0.255 Mask:255.255.255.0\n inet6 addr: fe80::12bf:ffff:eeee:2222/64 Scope:Link\n UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1\n RX packets:16264200 errors:0 dropped:1 overruns:0 frame:0\n TX packets:7205647 errors:0 dropped:0 overruns:0 carrier:0\n collisions:0 txqueuelen:1000 \n RX bytes:13151177627 (13.1 GB) TX bytes:2779457335 (2.7 GB)\n"...
> exec('ifconfig')
string(0) ""
バックティック演算子の使用はと同じであることに注意してくださいshell_exec()
。
更新:最後の1つは本当に説明する必要があります。何年も後にこの回答を見ると、なぜそれが空白になったのかわかりません!ダニエルは上でそれを説明しています-それexec
は最後の行だけを返すからであり、ifconfig
'の最後の行はたまたま空白です。
2>&1
Linuxマシンを使用している場合は、コマンドの最後に追加して、STDERRをSTDOUTにリダイレクトしてください。
exec
出力の最後の行を返すことに注意してください。必要に応じて、オプションで配列を2番目のパラメーターとして渡して完全な出力をキャプチャし、3番目のパラメーターとして整数を渡してシェルコマンドの戻り値をキャプチャし、エラーチェックに使用できます。最大の欠点shell_exec
は、コマンドが失敗した場合、または出力を生成しない場合にnullを返すため、戻り値をエラーチェックに確実に使用できないことです。
ここでは触れなかったいくつかの違い:
比較:
exec('ls', $out);
var_dump($out);
// Look an array
$out = shell_exec('ls');
var_dump($out);
// Look -- a string with newlines in it
逆に、コマンドの出力がxmlまたはjsonの場合、入力を他の形式に後処理する必要があるため、各行を配列の一部として使用することは望ましくありません。その場合は、shell_execを使用してください。 。
また、shell_execは、* nixに使用されているものに対して、backtic演算子のエイリアスであることを指摘する価値もあります。
$out = `ls`;
var_dump($out);
execは、実行されたコマンドからの戻りコードを提供する追加のパラメーターもサポートします。
exec('ls', $out, $status);
if (0 === $status) {
var_dump($out);
} else {
echo "Command failed with status: $status";
}
shell_execのマニュアルページに記載されているように、実行中のコマンドからの戻りコードが実際に必要な場合は、execを使用するしかありません。
exec
コマンドの戻りコードを(&$return_var
パラメーターを介して)取得できますが、取得するshell_exec
方法はありません。
date
、whoami
、ifconfig
、netstat
。