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 -b
en bash 4.4
, recibo una lista de todos los comandos shell incorporado. Veo, por ejemplo, eso [
y kill
se enumeran para ser construcciones de shell. Pero sus ubicaciones reales son:
/usr/bin/[
/bin/kill
Pensé que ser un builtin
medio significa que el comando se compila en el /bin/bash
ejecutable. 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
exec
manipular descriptores de archivos yeval
evaluar 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/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
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 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_MAX
bytes (vergetconf ARG_MAX
en 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,
cd
no 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
cd
en teoría podría tener (pero no haría mucho).fuente
chdir
/cd
eran binarios externos en los primeros Unices / pre-Unix antes de quefork
se introdujera./usr/bin/cd
, pero en realidad no cambiará el directorio de trabajo actual. Su manual dice:/usr/bin/cd
no 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.kill
tambié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
type
con el-a
interruptor que mostrará todas las instancias disponibles de un comando. En mi sistema Arch, eso muestra:Tenga en cuenta que
/sbin
,/usr/sbin
y/bin
todos 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/printf
es instalado por elcoreutils
paquete y/bin/kill
porutil-linux
.