
Я пытался отладить свой CGI-скрипт, который начинался со строки:
#!/usr/bin/env python3
Конечно, проблема была в том, что переменные среды (в частности, $PATH
) Apache HTTPd и моей оболочки различались.
После некоторых раскопок я обнаружил, что системный уровень .profile
для оболочки задается $PATH
путем вызова /usr/libexec/path_helper
. Я проверил это, вызвав /usr/libexec/path_helper
и сравнив вывод с выводом echo $PATH
.
Путь Apache HTTPd отличается от этого значения. Это заставляет меня предположить, что HTTPd устанавливает значение $PATH
вручную.
У меня вопрос, почему? Зачем процесс задавать $PATH
вручную? Я предполагаю, что /usr/libexec/path_helper
это какой-то системный стандарт, нет?
Итак, вопрос в том, почему процесс устанавливается $PATH
вручную, вместо того чтобы вызвать какой-то стандарт системного уровня, который /usr/libexec/path_helper
выглядит как стандарт системного уровня.
решение1
/usr/libexec/path_helper
Я видел это только в Mac OS X; демоны (а также cron) в Unix обычно не используют ту же среду (и ту же конфигурацию), что и оболочка, поэтому существует заметное разделение между интерактивными оболочками (для которых Apple предоставляет некоторую автоматическую настройку) и демонами (особенно теми, которые не управляются Apple).
На самом деле, может быть очень плохо, если сетевой демон выбрал новый путь, потому что какой-то пользователь установил какой-то случайный пакет, чтобы поиграться с ним, а затем сетевой демон внезапно вызывает неправильный инструмент из неправильного пути... или, может быть, сетевому демону нужна определенная версия программного обеспечения X, а не та, что из общесистемной системы путей...
(Кстати, я полностью отключаю /usr/libexec/path_help
и настраиваю PATH
все вручную везде, но я более или менее понимаю, какие проблемы меня ждут, если я буду делать это таким образом.)