PHP shell_exec () против exec () - PullRequest
       19

PHP shell_exec () против exec ()

319 голосов
/ 17 августа 2011

Я изо всех сил пытаюсь понять разницу между shell_exec() и exec() ...

Я всегда использовал exec() для выполнения команд на стороне сервера, когда бы я использовал shell_exec()?

Является ли shell_exec() просто сокращением для exec()? Похоже, то же самое с меньшим количеством параметров.

Ответы [ 4 ]

328 голосов
/ 17 августа 2011

shell_exec возвращает весь поток вывода в виде строки.exec возвращает последнюю строку вывода по умолчанию, но может предоставить весь вывод в виде массива, указанного в качестве второго параметра.

См.

69 голосов
/ 07 марта 2013

Вот различия. Обратите внимание на новые строки в конце.

> 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 идентично shell_exec().

Обновление: Я действительно должен объяснить это последнее. Глядя на этот ответ спустя годы, даже я не знаю, почему это оказалось пустым! Даниэль объясняет это выше - это потому, что exec возвращает только последнюю строку, а последняя строка ifconfig оказывается пустой.

48 голосов
/ 17 августа 2011

shell_exec - выполнить команду через оболочку и вернуть полный вывод в виде строки

exec - выполнить внешнюю программу.

Разница в том, что с shell_exec вы получаете вывод в качестве возвращаемого значения.

35 голосов
/ 24 апреля 2013

Пара различий, которые здесь не затрагивались:

  • С помощью 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

И наоборот, если выходные данные команды имеют формат 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.

...