Что происходит с окружением при запуске «su -c»?

Что происходит с окружением при запуске «su -c»?

Что происходит с окружением при запуске «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(выводит полную среду).

Связанный контент