.bashrc
é um arquivo de configuração do bash, apenas quando executado de forma interativa. Ele só é carregado quando você inicia o bash, não quando você executa algum outro programa como sh
(nem mesmo se o bash é chamado através do nome sh
). E só é carregado quando o bash é interativo, não quando está executando um script ou um comando com -c
.
sudo sh -c 'echo $PATH'
ou sudo bash -c 'echo $PATH'
não invoca um shell interativo, portanto .bashrc
não está envolvido.
sudo su; echo $PATH
executa uma instância interativa do shell do root. Se isso é bash, então ~root/.bashrc
é carregado. Este fragmento executa echo $PATH
quando este shell interativo terminar, portanto, o que acontecer no shell interativo não terá influência sobre o que o snippet imprime no final. Mas se você digitar echo $PATH
no prompt do shell interativo iniciado por sudo su
, verá o valor definido por ~root/.bashrc
.
Como .bashrc
é invocado em cada shell interativo, não por cascas de login (nem mesmo por cascas de login interativas, que é um defeito de projeto no bash), é o lugar errado para definir variáveis de ambiente. Use .bashrc
para configurações bash interativas, como combinações de teclas, aliases e configurações de conclusão. Configure variáveis de ambiente em arquivos que são carregados quando você efetua login: ~/.pam_environment
ou ~/.profile
.
Portanto, defina PATH
em .profile
em vez de .bashrc
e execute um shell de login com sudo -i 'echo $PATH'
ou explique explicitamente .profile
com sudo sh -c '. ~/.profile; echo $PATH'
.