Cada shell Unix tiene al menos algunos comandos integrados. Estos comandos integrados son parte del shell y se implementan como parte del código fuente del shell. El intérprete de comandos reconoce que el comando que se le solicitó ejecutar era uno de sus comandos incorporados, y realiza esa acción por sí mismo, sin llamar a un ejecutable por separado. Diferentes shells tienen diferentes builtins, aunque habrá una gran cantidad de superposición en el conjunto básico.
A veces, los builtins se incorporan por motivos de rendimiento. En este caso, a menudo también hay una versión de ese comando en $PATH
(posiblemente con un conjunto de características diferente, un conjunto diferente de argumentos reconocidos en la línea de comandos, etc.), pero el shell decidió implementar el comando como un comando incorporado para que pudiera salve el trabajo de desove de un proceso efímero para hacer un trabajo que podría hacer por sí mismo. Ese es el caso para bash y printf, por ejemplo:
$ type printf
printf is a shell builtin
$ which printf
/usr/bin/printf
$ printf
printf: usage: printf [-v var] format [arguments]
$ /usr/bin/printf
/usr/bin/printf: missing operand
Try `/usr/bin/printf --help' for more information.
Nótese que en el ejemplo anterior, printf es tanto una orden interna del shell (implementado como parte de golpe en sí mismo), así como un comando externo (localizado en/usr/bin/printf). Tenga en cuenta que también se comportan de manera diferente: cuando se llama sin argumentos, la versión incorporada y la versión de comando imprimen diferentes mensajes de error. Tenga en cuenta también que la opción -v var
(almacenar los resultados de este printf en una variable de shell llamada var
) solo se puede hacer como parte del shell - los subprocesos como/usr/bin/printf no tienen acceso a las variables del shell que los ejecutó.
Y eso nos lleva a la segunda parte de la historia: algunos comandos están integrados porque deben estarlo. Algunos comandos, como chmod
, son envoltorios delgados alrededor de las llamadas al sistema. Cuando ejecuta /bin/chmod 777 foo
, el shell se bifurca, execs/bin/chmod (pasando "777" y "foo") como argumentos, y el nuevo proceso chmod ejecuta el código C chmod("foo", 777);
y luego devuelve el control al shell. Sin embargo, esto no funcionaría para el comando cd
. Aunque cd
se parece al mismo caso que chmod
, tiene que comportarse de manera diferente: si el shell generó otro proceso para ejecutar la llamada al sistema chdir
, cambiaría el directorio solo para el proceso recién creado, no el shell. Luego, cuando el proceso retornó, el shell se dejaría en el mismo directorio que lo había estado todo el tiempo - por lo tanto, cd
debe implementarse como un shell builtin.
Esto no tiene nada que ver con el kernel. –