¿Por qué funciona "$ sudo echo 'yo'" aunque echo es una función integrada del shell?

¿Por qué funciona "$ sudo echo 'yo'" aunque echo es una función integrada del shell?

Entiendo que

sudo cd /directory

volverá:

sudo: cd: command not found

porque cd es un shell incorporado y no un binario. Pero entonces, ¿por qué

sudo echo 'this is a test'

¿funciona bien?

¿Qué está pasando aquí realmente? ¿Cómo sudoencuentra el comando echosi no es un shell?

Respuesta1

La razón es simple, cdes un shell incorporado (y una función de shell en algunos shells), mientras que echoes tanto un binario como un shell incorporado:

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

sudoNo puede manejar componentes integrados de shell, pero puede manejar archivos binarios en el archivo $PATH. Cuando usa sudo echo, /bin/echose encuentra en $PATH, por lo que lo usa, mientras tanto, sudo cdno puede encontrarlo, cdpor $PATHlo tanto, falla.

Respuesta2

correr

 which echo

da

 /bin/echo

echoes un programa sencillo y sudopuede "encontrarlo".

Como nota al margen, debe haber alguna opción ensudoers(5)

Respuesta3

El problema es más que sudo cdsu sistema operativo falle que sudo echoque tenga éxito.

sudo cd /directoryes un método bastante legítimo para comprobar si un usuario determinado, probablemente rootaquí, tiene permiso para cdacceder a algún directorio. Ésa es la razón por la que todos los sistemas operativos compatibles con PosixhacerProporcionar una versión ejecutable de cd.

Entonces, la respuesta a su pregunta es que sudo echo yofunciona por diseño porque echola proporciona un alias de shell y un comando ejecutable, pero sudo cd /directoryno funciona porque su sistema operativo, probablemente basado en Gnu/Linux, no funciona.el estándar Posixen este caso específico.

Una solución sencilla para su sistema sería ejecutarsudo sh -c "cd /directory"

información relacionada