Estou atualizando alguns dos perfis padrão para o bash e, a partir dos tutoriais que eu estava seguindo, era possível recarregar o novo perfil com as novas configurações de ambiente usando:
source /etc/bash.bashrc
A única coisa é - as novas variáveis de ambiente estavam disponíveis apenas para o meu usuário atual - e foram ignoradas quando usei o sudo. Eles só ficaram disponíveis para o sudo quando fechei minha sessão do terminal e voltei.
Quando tento usar:
sudo source /etc/bash.bashrc
Eu recebo o erro:
sudo: source: command not found
Existe uma maneira simples de carregar as novas configurações do perfil do bash para o sudo sem precisar fechar o terminal e reiniciar?
- Inicialmente, eu estava usando alguns scripts de instalação que faziam referência às variáveis. Descobri que, embora eles pudessem acessar as variáveis quando chamei os scripts diretamente (embora isso causasse um problema posterior na criação de diretórios, pois eu precisava ser root), chamar os scripts de instalação usando o sudo não.
Eu provei isso testando com estes comandos simples:
echo $ENV_VARIABLE
sudo echo $ENV_VARIABLE
O primeiro produziria o valor da variável, mas o segundo não produziria nada.
fonte
Respostas:
O problema é que
source
é um comando bash build-in (não um programa - comols
ougrep
). Eu acho que uma abordagem é fazer login como root e, em seguida, executar o comando source.fonte
source
é um shell embutido.sudo su
é uma maneira estranha de dizer isso - é melhor dizersudo -s
qual é a maneira do sudo de dizer "inicie um shell como esse usuário". Sua versão de uma linha não funcionará porque cada um dos comandos nela é executado pelo shell do usuário principal em um subprocesso separado.su
inicia um novo shell e a "origem" é executada somente após o término. O primeiro exemplo funciona apenas se a segunda linha usada dentro do shell raiz.sudo -s
não é melhor quesudo su
. Não terá nenhum efeito de qualquer maneira.sudo -s
tem um efeito semelhante ao iniciar um shell, mas para mim parece deselegante empilhar dois comandos "se tornar outro usuário" quando alguém o faria.O problema não é que
source
seja um comando interno do shell. O fato de ser isso é o que realmente está lançando ocommand not found
erro, mas isso não significa que funcionaria se fosse.O problema real é como as variáveis de ambiente funcionam. E eles funcionam assim: toda vez que um novo processo é iniciado, se nada acontecer, ele herda o ambiente de seu pai. Devido a isso, usar um subshell (por exemplo, digitar
bash
dentro de uma instância do bash) e observar a saída deenv
deve fornecer resultados semelhantes aos de seu pai.No entanto, devido ao modo como
sudo
funciona (como indicado em sua página de manual), o sudo tenta remover o ambiente do usuário e criar um ambiente "padrão" para o usuário suplente, para que a execução do comando seja executada como se o usuário que o invocou tivesse foi o usuário que chama (que é o comportamento esperado) e, portanto, executa o nautilus, comosudo nautilus
deve abrir uma pasta na/root
pasta, e não/home/yourusername
.Assim:
Fazendo algo como
sudo source script.sh
esudo command
, mesmo que funcionasse, não seria bem-sucedido em definir qualquer variável para a posteriorsudo command
.Para passar variáveis de ambiente, você pode dizer ao sudo para preservar o ambiente (por meio do
-E
switch; e ter permissões apropriadas no arquivo sudoers) e / ou configurá-lo para o comando comosudo VAR1=VALUE1 VAR2=VALUE2 command
.fonte
Usando a substituição do processo bash , você pode:
fonte
sudo
para acessar o perfil. O acima exposto fornece um meio de importar o perfil, evitando osudo: source: command not found
problema mencionado.Como Marcos diz , seu principal problema aqui é que
source
é um comando interno do shell que afeta apenas o processo do shell em que é executado.A solução mais fácil é iniciar um novo shell como root e o bash será lido automaticamente
/etc/bash.bashrc
quando for iniciado. Isso é tão simples quanto dizerfonte
Fechar e reabrir o terminal não deve mudar as coisas. Por padrão, o sudo retira o ambiente. Para desativar isso, adicione -E ao sudo.
fonte
O erro ocorre porque o binário que você está tentando chamar da linha de comando é apenas parte da variável PATH do usuário atual, mas não faz parte do PATH do usuário raiz.
Você pode verificar isso localizando o caminho do binário que você está tentando acessar. No meu caso, eu estava tentando chamar "bettercap-ng". Então eu corri,
Eu verifiquei se esse local faz parte do PATH do meu usuário root.
Portanto, o sudo não consegue encontrar o binário que estou tentando chamar na linha de comando. Portanto, retorna o comando de erro não encontrado.
Você pode direcionar o sudo para usar o PATH do usuário atual ao chamar um binário como abaixo.
De fato, pode-se criar um apelido:
Também é possível nomear o próprio apelido sudo, substituindo o sudo original.
fonte