O problema é que source
é um comando embutido bash (não é um programa - como ls
ou grep
). Eu acho que uma abordagem é fazer o login como root e, em seguida, executar o comando de origem.
sudo -s
source /etc/bash.bashrc
Eu atualizei alguns dos perfis padrão do bash, e vi nos tutoriais que estava seguindo que eu poderia 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 só estavam disponíveis para o meu usuário atual - e foram ignoradas quando eu usei o sudo. Eles só se tornaram disponíveis para o sudo quando eu fechei minha sessão de terminal e me juntei novamente.
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 bash para o sudo sem ter que fechar o terminal e reiniciar?
Inicialmente, eu estava usando alguns scripts de instalação que referenciavam as variáveis. Descobri que, embora eles pudessem acessar as variáveis quando eu chamei os scripts diretamente (embora, isso causaria um problema posterior ao criar diretórios, já que eu precisava ser o root), chamar os scripts de instalação usando sudo não seria.
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.
O problema é que source
é um comando embutido bash (não é um programa - como ls
ou grep
). Eu acho que uma abordagem é fazer o login como root e, em seguida, executar o comando de origem.
sudo -s
source /etc/bash.bashrc
O problema não é que source
seja um comando interno do shell. O fato de que é é o que realmente está causando o erro command not found
, 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 de env
deve fornecer resultados semelhantes aos do seu pai.
No entanto, devido a como sudo
funciona (como indicado em sua manpage), o sudo tenta remover o ambiente do usuário e criar um ambiente "padrão" para o usuário suplantante, para que o comando seja executado como se o usuário que o invocou fosse o usuário chamador (que é o comportamento esperado) e, portanto, executar o nautilus como sudo nautilus
deve abrir uma pasta na pasta /root
, e não /home/yourusername
.
Então:
Fazendo algo como sudo source script.sh
e, em seguida, sudo command
, mesmo que funcione, não seria bem-sucedido definir qualquer variável para o último sudo command
.
Para passar variáveis de ambiente, você pode dizer ao sudo para preservar o ambiente (através da -E
switch; e ter as permissões apropriadas no seu arquivo sudoers) e / ou defini-lo para o comando como sudo VAR1=VALUE1 VAR2=VALUE2 command
. / p>
Fechar e reabrir o terminal não deve mudar as coisas. Por padrão, o sudo remove o ambiente. Para desabilitar isso, adicione -E ao sudo.
Como Marcos diz , seu principal problema aqui é que source
é um comando interno do shell que afeta apenas o processo do shell no qual ele é executado.
A solução fácil é apenas iniciar um novo shell como root, e o bash lerá automaticamente /etc/bash.bashrc
quando for iniciado. Isso é tão simples quanto dizer
sudo bash
Tente executar este sudo su -c "source /etc/bash.bashrc"
Isso permitirá que você faça login temporariamente no código-fonte raiz do arquivo e sairá da sessão raiz automaticamente
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 root.
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,
$ which bettercap-ng
output: /home/user/work/bin/bettercap
Eu verifiquei se esse local é parte do PATH do meu usuário root.
$ sudo env | grep ^PATH
saída: PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
Então o sudo não consegue encontrar o binário que estou tentando chamar da linha de comando. Daí 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.
$ sudo -E env "PATH=$PATH" [command] [arguments]
Na verdade, pode-se criar um alias:
$ alias mysudo='sudo -E env "PATH=$PATH"'
Também é possível nomear o próprio alias sudo, substituindo o sudo original.
Por favor, consulte este vídeo para a solução passo a passo
Tags command-line sudo bash