我正在努力理解shell_exec()和exec()之间的区别…
我总是使用exec()来执行服务器端命令,什么时候我会使用shell_exec()?
shell_exec()只是exec()的缩写吗?它看起来是一样的,只是参数更少。
我正在努力理解shell_exec()和exec()之间的区别…
我总是使用exec()来执行服务器端命令,什么时候我会使用shell_exec()?
shell_exec()只是exec()的缩写吗?它看起来是一样的,只是参数更少。
Shell_exec以字符串形式返回所有输出流。Exec默认情况下返回输出的最后一行,但可以将所有输出作为指定为第二个参数的数组提供。
See
http://php.net/manual/en/function.shell-exec.php http://php.net/manual/en/function.exec.php
shell_exec -通过shell执行命令并以字符串形式返回完整的输出
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()相同。
更新:我真的应该解释最后一个。多年以后再看这个答案,我也不知道为什么答案是空白的!Daniel在上面解释了这一点——这是因为exec只返回最后一行,而ifconfig的最后一行恰好是空白。
这里没有涉及到一些区别:
使用exec(),您可以传递一个可选参数变量,该变量将接收一个输出行数组。在某些情况下,这可能节省时间,特别是如果命令的输出已经是表格形式的。
比较:
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是backtic操作符的别名,用于*nix。
$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。