Jestem stara się zrozumieć różnicę między shell_exec()
i exec()
...
Zawsze używałem exec()
poleceń po stronie serwera, kiedy miałbym ich używać shell_exec()
?
Czy to shell_exec()
tylko skrót exec()
? Wydaje się, że jest tak samo z mniejszą liczbą parametrów.
date
,whoami
,ifconfig
,netstat
.Odpowiedzi:
shell_exec
zwraca cały strumień wyjściowy jako ciąg.exec
domyślnie zwraca ostatni wiersz danych wyjściowych, ale może dostarczyć wszystkie dane wyjściowe jako tablicę określoną jako drugi parametr.Widzieć
źródło
exec()
mogę [zrobić] wszystkoshell_exec()
[może,] i więcej :) ”Oto różnice. Zwróć uwagę na nowe linie na końcu.
Zauważ, że użycie operatora backtick jest identyczne jak
shell_exec()
.Aktualizacja: Naprawdę powinienem wyjaśnić to ostatnie. Patrząc na tę odpowiedź wiele lat później, nawet nie wiem, dlaczego to wyszło puste! Daniel wyjaśnia to powyżej - to dlatego, że
exec
zwraca tylko ostatnią linię, aifconfig
ostatnia linia jest pusta.źródło
2>&1
na końcu polecenia, aby przekierować STDERR do STDOUT, jeśli korzystasz z komputera z systemem Linux.shell_exec
- Wykonaj polecenie przez powłokę i zwróć pełne dane wyjściowe jako ciągexec
- Uruchom program zewnętrzny.Różnica polega na tym,
shell_exec
że otrzymujesz wynik jako wartość zwracaną.źródło
exec
zwraca ostatni wiersz wyniku. W razie potrzeby można opcjonalnie przekazać tablicę jako drugi parametr do przechwycenia pełnego wyniku, a liczbę całkowitą jako trzeci parametr do przechwycenia wartości zwracanej przez komendę powłoki, której można użyć do sprawdzania błędów. Największym minusemshell_exec
jest to, że zwraca wartość null, jeśli polecenie nie powiedzie się LUB jeśli nie generuje żadnych danych wyjściowych, więc jego wartość zwracana nie może być niezawodnie wykorzystana do sprawdzania błędów.Kilka wyróżnień, których nie poruszono tutaj:
Porównać:
I odwrotnie, jeśli wynikiem działania polecenia jest xml lub json, to umieszczenie każdej linii jako części tablicy nie jest tym, czego potrzebujesz, ponieważ musisz przetworzyć dane wejściowe w innej formie, więc w takim przypadku użyj shell_exec .
Warto również zauważyć, że shell_exec jest aliasem dla operatora backtic, dla tych używanych do * nix.
exec obsługuje również dodatkowy parametr, który zapewni kod powrotu z wykonanego polecenia:
Jak zauważono na stronie podręcznika shell_exec, kiedy faktycznie potrzebujesz kodu powrotu z wykonywanej komendy, nie masz innego wyjścia, jak użyć exec.
źródło
exec
pozwala uzyskać kod powrotu polecenia (za pomocą&$return_var
parametru), aleshell_exec
nie zapewnia możliwości uzyskania go.