Я изо всех сил пытаюсь понять разницу между shell_exec()
и exec()
...
Я всегда использовал exec()
для выполнения команд на стороне сервера, когда я буду использовать shell_exec()
?
Это shell_exec()
просто сокращение для exec()
? Похоже, то же самое с меньшим количеством параметров.
date
,whoami
,ifconfig
,netstat
.Ответы:
shell_exec
возвращает весь выходной поток в виде строки.exec
по умолчанию возвращает последнюю строку вывода, но может предоставить весь вывод в виде массива, указанного в качестве второго параметра.Видеть
источник
exec()
могу [сделать] всеshell_exec()
[можно,] и даже больше :) »Вот различия. Обратите внимание на новые строки в конце.
Обратите внимание, что использование оператора backtick идентично
shell_exec()
.Обновление: я действительно должен объяснить это последнее. Глядя на этот ответ спустя годы, даже я не знаю, почему это оказалось пустым! Даниэль объясняет это выше - это потому, что
exec
возвращает только последнюю строку, аifconfig
последняя строка оказывается пустой.источник
2>&1
в конец команды, чтобы перенаправить STDERR в STDOUT, если вы работаете на машине с Linux.shell_exec
- Выполнить команду через оболочку и вернуть весь вывод в виде строкиexec
- Выполнить внешнюю программу.Разница в том, что
shell_exec
вы получаете вывод в качестве возвращаемого значения.источник
exec
возвращает последнюю строку вывода. При желании вы можете при желании передать массив в качестве второго параметра, чтобы захватить весь вывод, и целое число в качестве третьего параметра, чтобы захватить возвращаемое значение команды оболочки, которое можно использовать для проверки ошибок. Самым большим недостаткомshell_exec
является то, что она возвращает ноль, если команда не выполняется ИЛИ, если она не выдает никаких выходных данных, поэтому ее возвращаемое значение нельзя надежно использовать для проверки ошибок.Пара различий, которые не были затронуты здесь:
Для сравнения:
И наоборот, если выходные данные команды - xml или json, то каждая строка как часть массива - это не то, что вам нужно, так как вам нужно будет постобработать ввод в какую-то другую форму, поэтому в этом случае используйте shell_exec ,
Также стоит отметить, что shell_exec является псевдонимом для оператора backtic, для тех, которые используются для * nix.
exec также поддерживает дополнительный параметр, который предоставит код возврата от выполненной команды:
Как отмечено на странице справки shell_exec, когда вам действительно требуется код возврата от выполняемой команды, у вас нет другого выбора, кроме как использовать exec.
источник
exec
позволяет получить обратный код команды (через&$return_var
параметр), в то время какshell_exec
не дает никакой возможности получить его.