Por que "$ sudo echo 'yo'" funciona mesmo que echo seja uma função integrada no shell?

Por que "$ sudo echo 'yo'" funciona mesmo que echo seja uma função integrada no shell?

Eu entendi aquilo

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 sudoencontra o comando echose não é um shell?

Responder1

A razão é simples, cdé um shell embutido (e uma função de shell em alguns shells), enquanto echoé um binário e um shell embutido:

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

sudonão pode lidar com componentes internos do shell, mas pode lidar com binários no $PATH. Quando você usa sudo echo, /bin/echoé encontrado no $PATH, então ele usa isso, entretanto sudo cdnão consegue encontrar cdno $PATHportanto ele falha.

Responder2

correndo

 which echo

 /bin/echo

echoé um programa simples e sudopode "encontrá-lo".

Por outro lado, deve haver alguma opção emsudoers(5)

Responder3

A questão é mais sudo cdfalhar no seu sistema operacional do que sudo echoter sucesso.

sudo cd /directoryé um método bastante legítimo para verificar se um determinado usuário, provavelmente rootaqui, tem permissão para cdacessar algum diretório. Essa é a razão pela qual todos os sistemas operacionais compatíveis com Posixfazerforneça uma versão executável do cd.

Portanto, a resposta para sua pergunta sudo echo yofunciona por design, porque echoé fornecida por um alias de shell e por um comando executável, mas sudo cd /directorynão porque seu sistema operacional, provavelmente baseado em Gnu/Linux, está quebrandoo padrão Posixneste caso específico.

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

informação relacionada