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