“Sudo: source: comando não encontrado”

15
$ source /etc/environment 

$ sudo source /etc/environment 
[sudo] password for t: 
sudo: source: command not found

Parece que um shell diferente do que bashé executado para executar source /etc/environmente esse shell não tem sourcecomo embutido.

Mas as conchas padrão da minha e da raiz são ambas bash.

$ echo $SHELL
/bin/bash

Se sudoindeeds usa um shell diferente, por que é? Vi a resposta do slm , mas não entendo no meu caso.

StackExchange for All
fonte
4
sourceé um shell builtin..you não pode usar sudopara executar um builtin shell como um comando externo ..
heemayl
O problema é que você não pode ler o arquivo ou deseja que o ambiente definido no arquivo se aplique aos comandos sudo subsequentes?
precisa saber é o seguinte
@ Random832: quer o ambiente definidas no arquivo para aplicar a comandos sudo subseqüentes
Stackexchange para Todos

Respostas:

23

sourceé um shell embutido, portanto, não pode ser executado sem o shell. No entanto, por padrão, sudonão execute o shell. A partir desudo

Modelo de processo

Quando o sudo executa um comando, ele chama fork (2), configura o ambiente de execução conforme descrito acima e chama a chamada do sistema execve no processo filho

Se você deseja executar explicitamente o shell, use a -sopção:

# sudo -s source /etc/environment

O que ainda é inútil porque, após a saída do shell, as alterações no ambiente são perdidas.

myaut
fonte
7

No campo da solução do problema, em vez de responder à pergunta , eis a maneira mais óbvia (para mim) de obter um arquivo que somente o root pode ler:

source <(sudo cat /etc/environment)

Isso usa substituição de processo . Ele pega a saída do catcomando e o transforma em um pseudo-arquivo, para o qual você pode passar source. O source executa os comandos no shell atual.

Observe que, na maioria dos sistemas, /etc/environmenté legível pelo mundo; portanto, você deve poder executar isso:

source /etc/environment
Kevin
fonte
1
isso funciona, o aceite não faz
Claudiu Creanga
2

sudoespera um comando, mas você está dando um shell embutido para que ele não possa encontrar o comando. Se você escrever type source, poderá ver a saída: source is a shell builtine a saída de which sourceestá vazia.

Por exemplo sudo strace, funcionará e which stracedará saída porque strace é um comando.

Edit: Além disso, você pode ver sudo su;sudo source /etc/environmentfunciona bem, para que diferentes shell não sejam usados.

Esref
fonte