Ich kämpfe darum, den Unterschied zwischen shell_exec()
und exec()
...
Ich habe immer exec()
serverseitige Befehle ausgeführt. Wann würde ich sie verwenden shell_exec()
?
Ist shell_exec()
nur eine Abkürzung für exec()
? Es scheint dasselbe mit weniger Parametern zu sein.
date
,whoami
,ifconfig
,netstat
.Antworten:
shell_exec
Gibt den gesamten Ausgabestream als Zeichenfolge zurück.exec
Gibt standardmäßig die letzte Zeile der Ausgabe zurück, kann jedoch alle Ausgaben als Array bereitstellen, das als zweiter Parameter angegeben wird.Sehen
quelle
exec()
alles tunshell_exec()
kann und mehr :) "Hier sind die Unterschiede. Beachten Sie die Zeilenumbrüche am Ende.
Beachten Sie, dass die Verwendung des Backtick-Operators identisch ist mit
shell_exec()
.Update: Ich sollte das letzte wirklich erklären. Wenn ich mir diese Antwort Jahre später ansehe, weiß selbst ich nicht, warum das leer war! Daniel erklärt es oben - weil
exec
nur die letzte Zeile zurückgegeben wird undifconfig
die letzte Zeile leer ist.quelle
2>&1
, am Ende Ihres Befehls STDERR zu STDOUT umzuleiten, wenn Sie sich auf einem Linux-Computer befinden.shell_exec
- Führen Sie den Befehl über die Shell aus und geben Sie die vollständige Ausgabe als Zeichenfolge zurückexec
- Führen Sie ein externes Programm aus.Der Unterschied besteht darin, dass
shell_exec
Sie eine Ausgabe als Rückgabewert erhalten.quelle
exec
die letzte Zeile der Ausgabe zurückgegeben wird. Falls gewünscht, können Sie optional ein Array als zweiten Parameter übergeben, um die vollständige Ausgabe zu erfassen, und eine Ganzzahl als dritten Parameter, um den Rückgabewert des Shell-Befehls zu erfassen, der zur Fehlerprüfung verwendet werden kann. Der größte Nachteilshell_exec
ist, dass er null zurückgibt, wenn der Befehl fehlschlägt ODER wenn er keine Ausgabe erzeugt, sodass sein Rückgabewert nicht zuverlässig für die Fehlerprüfung verwendet werden kann.Einige Unterscheidungen, die hier nicht angesprochen wurden:
Vergleichen Sie:
Wenn die Ausgabe des Befehls hingegen xml oder json ist, ist es nicht das, was Sie möchten, jede Zeile als Teil eines Arrays zu haben, da Sie die Eingabe in eine andere Form nachbearbeiten müssen. Verwenden Sie in diesem Fall also shell_exec .
Es ist auch erwähnenswert, dass shell_exec ein Alias für den backtic-Operator ist, für diejenigen, die an * nix gewöhnt sind.
exec unterstützt auch einen zusätzlichen Parameter, der den Rückkehrcode des ausgeführten Befehls bereitstellt:
Wie auf der Handbuchseite shell_exec angegeben, haben Sie keine andere Wahl, als exec zu verwenden, wenn Sie tatsächlich einen Rückkehrcode für den ausgeführten Befehl benötigen.
quelle
exec
Ermöglicht das Abrufen des Rückkehrcodes des Befehls (über den&$return_var
Parameter),shell_exec
bietet jedoch keine Möglichkeit, ihn abzurufen.