我努力理解之间的区别shell_exec()
和exec()
...
我一直习惯于exec()
执行服务器端命令,何时使用shell_exec()
?
是否shell_exec()
只是一个速记exec()
?较少的参数似乎是同一件事。
我努力理解之间的区别shell_exec()
和exec()
...
我一直习惯于exec()
执行服务器端命令,何时使用shell_exec()
?
是否shell_exec()
只是一个速记exec()
?较少的参数似乎是同一件事。
Answers:
shell_exec
以字符串形式返回所有输出流。exec
默认情况下返回输出的最后一行,但是可以将所有输出作为指定为第二个参数的数组提供。
看到
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
的最后一行恰好为空白。
2>&1
如果您使用的是Linux计算机,请尝试在命令末尾添加以将STDERR重定向到STDOUT。
exec
返回输出的最后一行。如果需要,您可以选择传入一个数组作为第二个参数以捕获完整的输出,并传入一个整数作为第三个参数以捕获shell命令的返回值,该值可用于错误检查。最大的缺点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是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
无法获取它。
date
,whoami
,ifconfig
,netstat
。