我很难理解 shell_exec()
和 exec()
之间的区别......
我一直使用 exec()
来执行服务器端命令,我什么时候使用 shell_exec()
?
shell_exec()
只是 exec()
的简写吗?这似乎是相同的事情,参数更少。
date
、whoami
、ifconfig
、netstat
。
shell_exec
将所有输出流作为字符串返回。 exec
默认返回输出的最后一行,但可以将所有输出作为指定为第二个参数的数组提供。
看
http://php.net/manual/en/function.shell-exec.php
http://php.net/manual/en/function.exec.php
以下是不同之处。注意末尾的换行符。
> 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) ""
请注意,backtick operator 的使用与 shell_exec()
相同。
更新:我真的应该解释最后一个。多年后看着这个答案,即使我不知道为什么会出现空白! Daniel 在上面解释过——这是因为 exec
只返回最后一行,而 ifconfig
的最后一行恰好是空白的。
2>&1
以将 STDERR 重定向到 STDOUT。
shell_exec
- 通过 shell 执行命令并将完整的输出作为字符串返回
exec
- 执行外部程序。
不同之处在于,使用 shell_exec
您将输出作为返回值。
exec
返回输出的最后一行。如果需要,您可以选择传入一个数组作为第二个参数来捕获完整的输出,并传入一个整数作为第三个参数来捕获 shell 命令的返回值,该值可用于错误检查。 shell_exec
的最大缺点是,如果命令失败或不产生任何输出,它会返回 null,因此它的返回值不能可靠地用于错误检查。
这里没有提到的几个区别:
使用 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。
exec
允许您获取命令的返回码(通过 &$return_var
参数),而 shell_exec
无法获取它。
exec()
可以 [做] 一切shell_exec()
[可以,] 等等 :)"