.bashrc
é um arquivo de configuração do bash, somente quando é executado interativamente. Ele é carregado apenas quando você inicia o bash, não quando executa outro programa como sh
(nem mesmo se o bash for chamado pelo nome sh
). E só é carregado quando o bash é interativo, não quando ele está executando um script ou comando -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. Esse snippet é executado echo $PATH
assim que o shell interativo termina, portanto, o que quer que aconteça no shell interativo não influencia o que o snippet imprime no final. Mas se você digitar echo $PATH
no prompt do shell interativo iniciado sudo su
, verá o valor definido por ~root/.bashrc
.
Como .bashrc
é invocado em cada shell interativo, não por shells de login (nem mesmo por shells de login interativo, que é um defeito de design no bash), é o lugar errado para definir variáveis de ambiente. Use .bashrc
para configurações de bash interativas, como ligações de teclas, aliases e configurações de conclusão. Defina variáveis de ambiente nos arquivos carregados quando você efetua login: ~/.pam_environment
ou ~/.profile
.
Portanto, defina PATH
em .profile
vez de .bashrc
e execute um shell de logon com sudo -i 'echo $PATH'
, ou explique .profile
com sudo sh -c '. ~/.profile; echo $PATH'
.