O que acontece com o ambiente quando você executa “su -c”?

O que acontece com o ambiente quando você executa “su -c”?

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 $PATHsintaxe 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 -copção, então parece que você está no Linux. Em um Mac ou BSD, você obteria um login simplificado PATHem 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:/etccomo o novo arquivo $PATH. Em outros sistemas, ele pode ler ENV_SUPATHou /etc/login.defsconfiar no PAM para configurar o ambiente.

su ... "echo $PATH"mentiras, porque a $PATHparte é expandida pelo seu shell atual, muito antes de suser lançada. Use su ... 'echo $PATH'em vez disso (observe as aspas simples) ou su - -c env(imprime o ambiente completo).

informação relacionada