Por que “$ sudo echo 'yo'” funciona apesar de o echo ser um shell construído em função? [duplicado]

6

Eu entendo que

sudo cd /directory

retornará:

sudo: cd: command not found

porque cd é um shell embutido e não um binário. Mas então, por que

sudo echo 'this is a test'

funciona bem?

O que realmente está acontecendo aqui? Como sudo encontra o comando echo se não for um shell?

    
por Gilles 16.10.2014 / 16:53

3 respostas

18

O motivo é simples, cd é um shell embutido (e função shell em alguns shells), enquanto echo é tanto um binário quanto um shell embutido:

$ type -a cd  
cd is a shell builtin
$ type -a echo 
echo is a shell builtin
echo is /bin/echo

sudo não pode manipular builtins de shell, mas pode manipular binários no $PATH . Quando você usa sudo echo , /bin/echo é encontrado no $PATH , então ele usa isso, enquanto sudo cd não consegue encontrar cd no $PATH , portanto, ele falha.

    
por 16.10.2014 / 17:15
4

executando

 which echo

 /bin/echo

echo é um programa simples, e sudo pode "encontrá-lo".

Em uma nota lateral, deve haver alguma opção em sudoers(5)

    
por 16.10.2014 / 17:01
3

O problema é mais para sudo cd falhar no seu sistema operacional do que sudo echo ter sucesso.

sudo cd /directory é um método bastante legítimo para verificar se um determinado usuário, provavelmente root aqui, tem permissão para cd em algum diretório. Essa é a razão pela qual todos os SOs compatíveis com Posix do fornecem uma versão executável de cd .

Portanto, a resposta para a pergunta é sudo echo yo funciona por design porque echo é fornecido por um alias de shell e um comando executável, mas sudo cd /directory não porque o seu SO, provavelmente baseado em Gnu / Linux, está quebrando < a href="http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap01.html#tag_17_06"> o padrão Posix neste caso específico.

Uma solução simples para o seu sistema seria executar sudo sh -c "cd /directory"

    
por 16.10.2014 / 17:07

Tags