php shell\_exec () против exec ()

<p>я пытаюсь понять разницу между <code>shell\_exec()</code> и <code>exec()</code>...</p><p>я всегда использовал <code>exec()</code> для выполнения команд на стороне сервера, когда бы я использовал <code>shell\_exec()</code>?</p><p>является ли <code>shell\_exec()</code> просто сокращением для <code>exec()</code>? похоже, то же самое с меньшим количеством параметров.</p>

<p><code>shell\_exec</code> возвращает весь выходной поток в виде строки. <code>exec</code> возвращает последнюю строку вывода по умолчанию, но может предоставить весь вывод в виде массива, указанного в качестве второго параметра.</p><p>увидеть</p><ul> <li> <a href="http://php.net/manual/en/function.shell-exec.php">http://php.net/manual/en/function.shell-exec.php</a> </li> <li> <a href="http://php.net/manual/en/function.exec.php">http://php.net/manual/en/function.exec.php</a> </li> </ul>

<p>вот различия. обратите внимание на новые строки в конце.</p><pre><code>> 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) "" </code></pre><p>обратите внимание, что использование <a href="http://www.php.net/manual/en/language.operators.execution.php">оператор обратной галочки</a> идентично <a href="http://www.php.net/manual/en/function.shell-exec.php"><code>shell\_exec()</code></a> .</p><p><strong> обновление: </strong> я действительно должен объяснить это последнее. глядя на этот ответ спустя годы, даже я не знаю, почему это оказалось пустым! даниэль объясняет это выше - это потому, что <code>exec</code> возвращает только последнюю строку, а последняя строка <code>ifconfig</code> оказывается пустой.</p>

<p> <a href="http://php.net/manual/en/function.shell-exec.php"><code>shell\_exec</code></a> - выполнить команду через shell <strong> и вернуть полный вывод в виде строки </strong></p><p> <a href="http://php.net/manual/en/function.exec.php"><code>exec</code></a> - выполнить внешнюю программу.</p><p>разница в том, что с <code>shell\_exec</code> вы получаете вывод в качестве возвращаемого значения.</p>

<p>несколько различий, которые не были затронуты здесь:</p><ul> <li>с помощью exec () вы можете передать необязательную переменную param, которая получит массив выходных строк. в некоторых случаях это может сэкономить время, особенно если выходные данные команд уже представлены в виде таблицы.</li> </ul><p>для сравнения:</p><pre><code>exec('ls', $out); var_dump($out); // look an array $out = shell_exec('ls'); var_dump($out); // look -- a string with newlines in it </code></pre><p>и наоборот, если выходные данные команды - xml или json, то каждая строка как часть массива - это не то, что вам нужно, так как вам нужно будет постобработать ввод в какую-то другую форму, поэтому в этом случае используйте shell\_exec ,.</p><p>также стоит отметить, что shell\_exec является псевдонимом для оператора backtic, для тех, которые используются для * nix.</p><pre><code>$out = ls; var_dump($out); </code></pre><p>exec также поддерживает дополнительный параметр, который предоставит код возврата от выполненной команды:</p><pre><code>exec('ls', $out, $status); if (0 === $status) { var_dump($out); } else { echo "command failed with status: $status"; } </code></pre><p>как отмечено на странице справки shell\_exec, когда вам действительно требуется код возврата от выполняемой команды, у вас нет другого выбора, кроме как использовать exec.</p>