
Что происходит с окружением при запуске «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
Есть идеи?
решение1
То, что вы видите, это факт, который $PATH
раскрывается в первой пользовательской оболочке во время обработки аргументов, до su(1)
запуска команды, так что это выглядит так, как будто это всегда так. Если вы используете жесткие кавычки ( 'echo $PATH'
), вы должны увидеть что-то другое, или просто сделать \$
.
Это сохранит $PATH
синтаксис до тех пор, пока su(1)
команда не запустится. Хотя обычно это не влияет на среду, это запускает новую оболочку, поэтому вам следует проверить PATH=
строки в различных скриптах запуска оболочки.
У вас su(1)
есть -c
возможность, так что вы, похоже, находитесь на Linux. На Mac или BSD вы получите упрощенный вход PATH
вместо входа, PATH
но у вас все равно будет та же проблема "когда я расширил PATH?".
решение2
При использовании su -
или su -l
эмулируется сеанс входа в систему, который включает сброс среды в чистое состояние.
В Arch Linux su -
использует жестко закодированную строку /usr/ucb:/bin:/usr/bin:/etc
как новый $PATH
. В других системах он может читать ENV_SUPATH
из /etc/login.defs
, или полагаться на PAM для настройки среды.
su ... "echo $PATH"
ложь, потому что $PATH
часть расширяется вашей текущей оболочкой, задолго до su
запуска. su ... 'echo $PATH'
Вместо этого используйте (обратите внимание на одинарные кавычки) или su - -c env
(выводит полную среду).