396 Stimmen

PHP shell_exec() gegenüber exec()

Es fällt mir schwer, den Unterschied zu verstehen zwischen shell_exec() y exec() ...

Ich habe immer exec() um serverseitige Befehle auszuführen, wann würde ich die shell_exec() ?

Ist shell_exec() nur eine Kurzform für exec() ? Es scheint dasselbe zu sein, nur mit weniger Parametern.

393voto

Daniel A. White Punkte 180762

shell_exec gibt den gesamten Ausgabestrom als Zeichenkette zurück. exec gibt standardmäßig die letzte Zeile der Ausgabe zurück, kann aber die gesamte Ausgabe als Array bereitstellen, das als zweiter Parameter angegeben wird.

Siehe

87voto

mpen Punkte 253762

Hier sind die Unterschiede. Beachten Sie die Zeilenumbrüche am Ende.

> 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) ""

Beachten Sie, dass die Verwendung des Backtick-Operator ist identisch mit shell_exec() .

Aktualisierung: Den letzten Punkt sollte ich wirklich erklären. Wenn ich mir diese Antwort Jahre später ansehe, weiß ich nicht einmal, warum sie leer geblieben ist! Daniel erklärt es oben - es ist, weil exec gibt nur die letzte Zeile zurück, und ifconfig ist die letzte Zeile zufällig leer.

54voto

J0HN Punkte 25228

shell_exec - Befehl über Shell ausführen und geben die komplette Ausgabe als String zurück

exec - Führen Sie ein externes Programm aus.

Der Unterschied besteht darin, dass bei shell_exec erhalten Sie eine Ausgabe als Rückgabewert.

43voto

gview Punkte 14129

Es gibt einige Besonderheiten, die hier nicht angesprochen wurden:

  • Mit exec() können Sie eine optionale param-Variable übergeben, die ein Array von Ausgabezeilen erhält. In einigen Fällen kann dies Zeit sparen, insbesondere wenn die Ausgabe der Befehle bereits in Tabellenform vorliegt.

Vergleichen Sie:

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

$out = shell_exec('ls');
var_dump($out);
// Look -- a string with newlines in it

Umgekehrt, wenn die Ausgabe des Befehls ist xml oder json, dann mit jeder Zeile als Teil eines Arrays ist nicht das, was Sie wollen, wie Sie brauchen, um die Eingabe in eine andere Form nachbearbeiten, so dass in diesem Fall verwenden shell_exec.

Es ist auch erwähnenswert, dass shell_exec ein Alias für den Backtic-Operator ist, für diejenigen, die mit *nix vertraut sind.

$out = `ls`;
var_dump($out);

exec unterstützt auch einen zusätzlichen Parameter, der den Rückgabecode des ausgeführten Befehls angibt:

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

Wie in der shell_exec-Handbuchseite erwähnt, haben Sie keine andere Wahl, als exec zu verwenden, wenn Sie tatsächlich einen Rückgabewert des auszuführenden Befehls benötigen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X