En el manual de bash , está escrito que
Builtin commands are contained >>> within <<< the shell itself
Además, esta respuesta dice que
A built-in command is simply a command that the shell carries out itself,
instead of interpreting it as a request to load and run some
>>> other program <<<
Cuando corro compgen -ben bash 4.4, recibo una lista de todos los comandos shell incorporado. Veo, por ejemplo, eso [y killse enumeran para ser construcciones de shell. Pero sus ubicaciones reales son:
/usr/bin/[
/bin/kill
Pensé que ser un builtinmedio significa que el comando se compila en el /bin/bashejecutable. Entonces, ¿qué es lo que realmente me confunde? Corríjame, pero ¿cómo puede ser un comando separado builtin, cuando en realidad no es parte del shell?
bash
shell
shell-builtin
manifestante
fuente
fuente

execmanipular descriptores de archivos yevalevaluar los comandos. No son necesarios como comandos independientesRespuestas:
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 incorporadoprintf.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(imprimir en una variable) que el externo
/usr/bin/printfsimplemente 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
por lo tanto, es seguro si
printfes un comando incorporado de shell. La restricción en la longitud de la línea de comando proviene de laexecve()función de biblioteca C utilizada para ejecutar un comando externo. Si la línea de comando y el entorno actual es mayor queARG_MAXbytes (vergetconf ARG_MAXen el shell), la llamada aexecve()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 incorporadobash, use egHay una breve lista de utilidades que deben integrarse en un shell (tomado de la lista de incorporaciones especiales del estándar POSIX )
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,
cdno forma parte de esta lista, pero POSIX dice lo siguiente al respecto:Por lo tanto, supongo que las incorporaciones "especiales" no pueden tener contrapartes externas, mientras que
cden teoría podría tener (pero no haría mucho).fuente
chdir/cderan binarios externos en los primeros Unices / pre-Unix antes de queforkse introdujera./usr/bin/cd, pero en realidad no cambiará el directorio de trabajo actual. Su manual dice:/usr/bin/cdno tiene ningún efecto en el proceso de invocación, pero se puede usar para determinar si un directorio dado se puede establecer como el directorio actual.killtambién es bueno porque no necesita bifurcar otro proceso, bueno si has alcanzado el límite de tu número de procesos.Usted está (muy comprensible) confundido por el hecho de que existen algunas órdenes internas tanto como órdenes internas y como comandos externos. Entonces, si bien tiene razón en que, por ejemplo, hay un
/bin/[comando, eso no significa que su "ubicación real" esté dentro/bin.Cualquier forma fácil de probar esto es ejecutar
typecon el-ainterruptor que mostrará todas las instancias disponibles de un comando. En mi sistema Arch, eso muestra:Tenga en cuenta que
/sbin,/usr/sbiny/bintodos los enlaces simbólicos apuntan/usr/bin, por lo que solo hay un externo[:Como puede ver,
[es tanto un comando incorporado como un comando externo, y lo mismo es cierto para varios otros constructores de shell. Sin embargo, eso no cambia el hecho de que también son componentes integrados de shell, compilados en el propio shell.fuente
/bin/printfes instalado por elcoreutilspaquete y/bin/killporutil-linux.