2010-07-07 17 views

Respuesta

12

Si desea ver cómo las órdenes internas de bash se define continuación, sólo tiene que mirar a Section 4 of The Bash Man Page.

Sin embargo, si usted quiere saber cómo bultins fiesta están implementados , usted tiene que mirar a the Bash source code debido a que estos comandos se compilan en el ejecutable bash.

Una manera rápida y fácil de ver si un comando es un comando incorporado bash es usar el comando help. Ejemplo, help cd le mostrará cómo se define el bash builtin de 'cd'. Del mismo modo para help echo.

3

Mañjari, comprobar el código fuente de la cáscara del golpe de ftp://ftp.gnu.org/gnu/bash/bash-2.05b.tar.gz Usted encontrará que la definición de cáscara de comandos integrados en no en un ejecutable binario separado pero su dentro del propio binario cáscara (el nombre de la shell claramente sugiere esto).

1

Una carcasa incorporada - http://linux.about.com/library/cmd/blcmdl1_builtin.htm por ej. -

which cd 
/usr/bin/which: no cd in (/usr/bin:/usr/local/bin...... 

No es un shell incorporado sino un archivo binario.

which ls 
/bin/ls 
+2

No es del todo cierto, a veces se superponen las construcciones internas y los ejecutables, por ejemplo. aunque hay un programa '/ bin/echo', la mayoría de las shells tienen su propio 'echo' incorporado. –

+0

otro ejemplo es el "tiempo" –

11

El conjunto real de integradas varía de shell a shell. Hay:

  • Special built-in utilities, que debe ser incorporado, debido a que tienen algunas propiedades especiales
  • Regular built-in utilities, que casi siempre están incorporados, a causa de la actuación o de otras consideraciones
  • Cualquier utilidad estándar también puede incorporarse si lo desea un implementador de shell.

Puede averiguar si la utilidad se basa en el uso de la orden type, que es apoyada por la mayoría de los proyectiles (aunque su producción no ha sido estandarizada). Un ejemplo de dash:

$ type ls 
ls is /bin/ls 
$ type cd 
cd is a shell builtin 
$ type exit 
exit is a special shell builtin 

Re cd utilidad, en teoría, no hay nada que impida un implementador shell para implementarlo como comando externo. cd no puede cambiar el directorio actual del shell directamente, pero, por ejemplo, cd podría comunicar un nuevo directorio al proceso del shell a través de un socket. Pero nadie lo hace porque no tiene sentido. Excepto muy antiguos proyectiles (donde no había una noción de complementos), donde cd utilizó algún truco del sistema sucio para hacer su trabajo.

¿Cómo se implementa cd dentro del armazón? El algoritmo básico se describe here. También puede hacer algo de trabajo para soportar las características adicionales de shell.

2

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.

Cuestiones relacionadas