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 sudo
encontra o comando echo
se 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
sudo
nã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 cd
não consegue encontrar cd
no $PATH
portanto ele falha.
Responder2
correndo
which echo
dá
/bin/echo
echo
é um programa simples e sudo
pode "encontrá-lo".
Por outro lado, deve haver alguma opção emsudoers(5)
Responder3
A questão é mais 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
acessar 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 yo
funciona por design, porque echo
é fornecida por um alias de shell e por um comando executável, mas sudo cd /directory
nã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"