PHP shell_exec()vs exec()

Web*_*net 327 php shell command exec

我很难理解shell_exec()exec()... 之间的区别

我一直习惯于exec()执行服务器端命令,我shell_exec()什么时候使用?

是否shell_exec()只是一个速记exec()?参数较少似乎是一样的.

Dan*_*ite 336

shell_exec将所有输出流作为字符串返回.exec默认情况下返回输出的最后一行,但可以将所有输出提供为指定为第二个参数的数组.

看到

  • 如果您需要退出值和所有输出,您可能仍然更好地使用"exec"而不是"shell_exec".一旦你将输出参数传递给"exec",它将被输出的每一行填充,在我看来"exec"可以是"shell_exec"的所有内容以及更多:) (21认同)
  • @ daniel-a-white我知道这是一个旧的,但它很受欢迎所以你应该编辑你的答案以反映@preexo的评论 - [exec()](http://php.net/manual/en/ function.exec.php)还可以在使用其可选参数时返回整个输出.另外,无关,有人应该对这两个命令进行基准测试,看看哪个更好,因为@preexo说"_it似乎我`exec()`可以[做]所有东西`shell_exec()`[can,]等等:)_" (4认同)

mpe*_*pen 73

这是差异.请注意最后的换行符.

> 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) ""
Run Code Online (Sandbox Code Playgroud)

请注意,使用反引号运算符是相同的shell_exec().

更新:我真的应该解释最后一个.几年后看这个答案,即使我不知道为什么会出现空白!丹尼尔在上面解释了 - 这是因为exec只返回最后一行,而ifconfig最后一行恰好是空白.


J0H*_*0HN 48

shell_exec- 通过shell执行命令并将完整输出作为字符串返回

exec - 执行外部程序.

不同之处在于,shell_exec您将输出作为返回值.

  • 简洁明了!还应该注意到`exec`返回输出的最后一行.如果需要,您可以选择传入一个数组作为第二个参数来捕获完整输出,并使用一个整数作为第三个参数来捕获shell命令的返回值,该参数可用于错误检查.`shell_exec`的最大缺点是,如果命令失败则返回null或者如果它没有产生任何输出,则返回值不能可靠地用于错误检查. (4认同)

gvi*_*iew 37

这里没有涉及的几个区别:

  • 使用exec(),您可以传递一个可选的param变量,该变量将接收输出行数组.在某些情况下,这可能会节省时间,尤其是在命令输出已经是表格的情况下.

相比:

exec('ls', $out);
var_dump($out);
// Look an array

$out = shell_exec('ls');
var_dump($out);
// Look -- a string with newlines in it
Run Code Online (Sandbox Code Playgroud)

相反,如果命令的输出是xml或json,那么将每一行作为数组的一部分并不是你想要的,因为你需要将输入后处理成其他形式,所以在这种情况下使用shell_exec .

值得指出的是,shell_exec是fortic运算符的别名,对于那些习惯于*nix的人来说.

$out = `ls`;
var_dump($out);
Run Code Online (Sandbox Code Playgroud)

exec还支持一个附加参数,该参数将提供执行命令的返回码:

exec('ls', $out, $status);
if (0 === $status) {
    var_dump($out);
} else {
    echo "Command failed with status: $status";
}
Run Code Online (Sandbox Code Playgroud)

如shell_exec手册页中所述,当您实际需要从正在执行的命令返回代码时,您别无选择,只能使用exec.

  • 另外:`exec`允许你获得命令的返回代码(通过`&$ return_var`参数),而`shell_exec`则无法获取它. (3认同)