Что происходит со средой, когда Вы работаете "su-c"?
Причина, которую я спрашиваю, это таинственное поведение:
bash$ which firefox
/usr/local/bin/firefox
bash$ su - user -c "echo $PATH"
bin:/usr/bin:/sbin:/usr/sbin:/opt/java/bin:/usr/local/bin:...
bash$ su - user -c "firefox ..."
-bash: firefox: command not found
Какие-либо идеи?
То, что Вы видите, является фактом это $PATH
расширен в первой пользовательской оболочке во время обработки аргумента, перед su(1)
управляйте выполнениями, таким образом, похоже, что это всегда делает. Если Вы используете твердые кавычки ('echo $PATH'
) необходимо видеть что-то другое или просто сделать \$
.
Это сохранит $PATH
синтаксис до окончания su(1)
выполнения команды. В то время как это обычно не играет со средой, это действительно запускает новую оболочку, и таким образом, необходимо проверить на PATH=
строки в различной оболочке запускают сценарии.
Ваш su(1)
имеет a -c
опция, таким образом, Вы, казалось бы, были бы на Linux. На Mac или BSD Вы получили бы упрощенный PATH
вместо входа в систему PATH
но у Вас все еще было бы то же, "когда я разворачивал ПУТЬ?" проблема.
Когда su -
или su -l
используется, это эмулирует сессию входа в систему, которая включает сброс среды к чистому состоянию.
На дуге Linux, su -
использует строку hardcoded /usr/ucb:/bin:/usr/bin:/etc
как новое $PATH
. В других системах это могло бы читать ENV_SUPATH
от /etc/login.defs
, или полагайтесь на PAM для установки среды.
su ... "echo $PATH"
находится, потому что $PATH
часть расширена Вашей текущей оболочкой, путем прежде su
запускается. Использовать su ... 'echo $PATH'
вместо этого (отмечают одинарные кавычки), или su - -c env
(печатает полную среду).