.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'
.
.profile
? Você quer dizer/root/.profile
ou/home/user/.profile
? Eu tentei adicionarexport PATH=$PATH:/mydir
aos dois. Não funcionou. Eu tentei semexport
, isso também não funcionou.Veja as opções
-E
e-i
.-E
: Indica à política de segurança que o usuário deseja preservar suas variáveis de ambiente existentes. A política de segurança pode retornar um erro se o usuário não tiver permissão para preservar o ambiente.-i
: Execute o shell especificado pela entrada do banco de dados de senha do usuário de destino como um shell de logon. Isso significa que os arquivos de recursos específicos de login, como .profile ou .login, serão lidos pelo shell. Se um comando for especificado, ele será passado para o shell para execução através da opção -c do shell. Se nenhum comando for especificado, um shell interativo será executado. O sudo tenta mudar para o diretório inicial desse usuário antes de executar o shell. O comando é executado com um ambiente semelhante ao que um usuário receberia ao efetuar login. A seção Ambiente de comando no manual sudoers (5) documenta como a opção -i afeta o ambiente em que um comando é executado quando a política de sudoers é em uso.fonte
Você pode
sudo bash
, que lê osbash
arquivos de inicialização conforme documentado nabash
página / documentação do manual. Observe, no entanto, que ela pode não definir aHOME
variável de ambiente corretamente. Isso pode ser corrigido nobash
arquivo de inicialização de todo o sistema (/etc
a localização exata depende da distribuição) - teste se$uid
é 0.fonte