No todas las utilidades que puede ejecutar en un intérprete de comandos de shell realmente deben existir como ejecutables reales en el sistema de archivos. También se pueden denominar shell built-ins, lo que significa – lo has adivinado – que están integrados en el shell.
El Single Unix Specification hace, en general, no especificar si una utilidad tiene que ser proporcionada como un ejecutable o como un built-in, que queda como un detalle de implementación interna privada al proveedor del sistema operativo.
Las únicas excepciones son los llamados special built-ins, que debe se proporciona como muebles empotrados, debido a que afectan el comportamiento de la cáscara sí de una manera que los ejecutables regulares (o muebles empotrados incluso regulares) no se puede (por ejemplo set
, que establece variables que persisten incluso después de que set
sale).Esos muebles empotrados especiales son:
break
:
continue
.
eval
exec
exit
export
readonly
return
set
shift
times
trap
unset
Tenga en cuenta que cd
es no en esa lista, lo que significa que cd
no es una función especial incorporada. De hecho, according to the specification, sería perfectamente legal implementar cd
como un ejecutable regular. Simplemente no es posible, por las razones dadas por las otras respuestas.
Y si se desplaza hacia abajo a la sección no normativa de la especificación, es decir, a la parte que no es oficialmente parte de la especificación, pero sólo meramente informativos, se encuentra que de hecho se menciona de forma explícita:
Como el cd afecta al entorno de ejecución del shell actual, siempre se proporciona como un shell normal incorporado.
Por lo tanto, la especificación no requiere cd
para ser un built-in, pero es simplemente imposible hacer lo contrario.
Tenga en cuenta que a veces las utilidades se proporcionan como un built-in y como un archivo ejecutable. Un buen ejemplo es la utilidad time
, que en un sistema GNU típico se proporciona como un ejecutable por el paquete Coreutils y como un shell incorporado por Bash. Esto puede generar confusión, porque cuando hace man time
, obtiene la página de manual del ejecutable time
(el time
incorporado está documentado en man builtins
), pero cuando ejecuta time
obtiene el time
incorporado, que no admite las mismas características como el ejecutable time
cuya página de manual acaba de leer. Debe ejecutar explícitamente /usr/bin/time
(o cualquier ruta en la que haya instalado Coreutils) para obtener el ejecutable.
+1 para una explicación en profundidad –
¿me puede decir algún otro binario alternativo para "cd" ?? – zappy
@zappy Citando mi respuesta: "el comando cd debe implementarse como un shell incorporado". En otras palabras, no puede tener un binario 'cd'. –