Отложите, на данный момент, участие PHP в вашем вопросе. Открыть окно терминала; т.е. интерактивная оболочка. Введите env
, чтобы отобразить все экспортированные, то есть переменные среды. Теперь введите env -i env
, чтобы запустить ту же команду с пустым окружением. Первый env
должен показать все ожидаемые переменные env; например, PATH
и HOME
. Второй должен выводить ничего, показывая, что env -i
фактически удалил все переменные env. Теперь наберите env -i bash -c set
. Вау! Что это за вары и откуда они взялись?
Часть ответа заключается в том, что команда оболочки set
не показывает только env vars. Он показывает все переменные, определенные в контексте выполнения оболочки. Теперь сделайте env -i bash -c env
. Это покажет только переменные env, созданные оболочкой. Обратите внимание, что список намного короче. В частности, обратите внимание, что bash -c set
перечислены переменные, такие как PATH
, но bash -c env
нет. Это потому, что, хотя оболочка определила стандартную переменную PATH, чтобы она была минимально функциональной, она не экспортировала автоматически эту переменную.
Когда вы выполняете passthru('set');
, вы более или менее делаете то же самое, что и набираете bash -c set
в приглашении оболочки. И это не просто показывает env vars. Я сказал «более или менее», потому что в действительности php, вероятно, делает sh -c set
«под капотом», и поведение sh будет слегка отличаться от других оболочек, таких как bash, ksh или zsh.