Los comandos que están integrados en el shell a menudo están integrados debido al aumento de rendimiento que esto proporciona. Llamar al externo printf
, por ejemplo, es más lento que usar el incorporado printf
.
Dado que algunas utilidades no necesitan ser incorporadas, a menos que sean especiales, como cd
, también se proporcionan como utilidades externas . Esto es para que los scripts no se rompan si son interpretados por un shell que no proporciona un equivalente incorporado.
Algunos complementos de shell también proporcionan extensiones al comando externo equivalente. Bash printf
, por ejemplo, es capaz de hacer
$ printf -v message 'Hello %s' "world"
$ echo "$message"
Hello world
(imprimir en una variable) que el externo /usr/bin/printf
simplemente no podría hacer ya que no tiene acceso a las variables de shell en la sesión de shell actual (y no puede cambiarlas).
Las utilidades integradas tampoco tienen la restricción de que su línea de comando expandida tenga que ser más corta que cierta longitud. Haciendo
printf '%s\n' *
por lo tanto, es seguro si printf
es un comando incorporado de shell. La restricción en la longitud de la línea de comando proviene de la execve()
función de biblioteca C utilizada para ejecutar un comando externo. Si la línea de comando y el entorno actual es mayor que ARG_MAX
bytes (ver getconf ARG_MAX
en el shell), la llamada a execve()
fallará. Si la utilidad está integrada en el shell, execve()
no es necesario llamarla.
Las utilidades integradas tienen prioridad sobre las utilidades que se encuentran en $PATH
. Para deshabilitar un comando incorporado bash
, use eg
enable -n printf
Hay una breve lista de utilidades que deben integrarse en un shell (tomado de la lista de incorporaciones especiales del estándar POSIX )
break
colon (:)
continue
dot (.)
eval
exec
exit
export
readonly
return
set
shift
times
trap
unset
Es necesario incorporarlos, ya que manipulan directamente el entorno y el flujo del programa de la sesión de shell actual. Una utilidad externa no podría hacer eso.
Curiosamente, cd
no forma parte de esta lista, pero POSIX dice lo siguiente al respecto:
Dado que cd
afecta el entorno actual de ejecución del shell, siempre se proporciona como un shell integrado normal. Si se llama en un subshell o en un entorno de ejecución de utilidad separado, como uno de los siguientes:
(cd /tmp)
nohup cd
find . -exec cd {} \;
no afecta el directorio de trabajo del entorno de la persona que llama.
Por lo tanto, supongo que las incorporaciones "especiales" no pueden tener contrapartes externas, mientras que cd
en teoría podría tener (pero no haría mucho).