4

Что происходит с окружением, когда вы запускаете "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

Есть идеи?

2 ответа2

7

Когда используется 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 (печатает всю среду).

3

То, что вы видите, это тот факт, что $PATH раскрывается в оболочке первого пользователя во время обработки аргумента перед запуском команды su(1) , так что похоже, что это происходит всегда. Если вы используете жесткие кавычки ('echo $PATH'), вы должны увидеть что-то другое или просто сделать \$ .

Это сохранит синтаксис $PATH до тех пор, пока не выполнится команда su(1) . Хотя обычно он не взаимодействует со средой, он запускает новую оболочку, поэтому вы должны проверить наличие строк PATH= в различных сценариях запуска оболочки.

Ваш su(1) имеет опцию -c , так что вы, похоже, работаете в Linux. На Mac или BSD вы получите упрощенный PATH вместо входа в PATH , но вы по- прежнему имеют те же « , когда я расширить PATH?"вопрос.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .