
O que acontece com o ambiente quando você executa “su -c”?
A razão pela qual pergunto é este comportamento misterioso:
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
Alguma ideia?
Responder1
O que você está vendo é o fato de que $PATH
é expandido no primeiro shell do usuário durante o processamento do argumento, antes da su(1)
execução do comando, então parece que sempre acontece. Se você usar aspas duras ( 'echo $PATH'
), deverá ver algo diferente ou apenas fazer \$
.
Isso preservará a $PATH
sintaxe até a su(1)
execução do comando. Embora normalmente não mexa no ambiente, ele inicia um novo shell e, portanto, você deve verificar se há PATH=
linhas nos vários scripts de inicialização do shell.
Você su(1)
tem uma -c
opção, então parece que você está no Linux. Em um Mac ou BSD, você obteria um login simplificado PATH
em vez do login PATH
, mas ainda teria o mesmo "quando expandi o PATH?" emitir.
Responder2
Quando su -
ou su -l
é usado, ele emula uma sessão de login, que envolve a redefinição do ambiente para um estado limpo.
No Arch Linux, su -
usa a string codificada /usr/ucb:/bin:/usr/bin:/etc
como o novo arquivo $PATH
. Em outros sistemas, ele pode ler ENV_SUPATH
ou /etc/login.defs
confiar no PAM para configurar o ambiente.
su ... "echo $PATH"
mentiras, porque a $PATH
parte é expandida pelo seu shell atual, muito antes de su
ser lançada. Use su ... 'echo $PATH'
em vez disso (observe as aspas simples) ou su - -c env
(imprime o ambiente completo).