historia corta: El shebang (#!
) línea es leído por
la carcasa (por ejemplo
sh
,
bash
, etc.)
del sistema operativo programa cargador. Si bien formalmente se ve como un comentario, el hecho de que sean los dos primeros bytes de un archivo marca todo el archivo como un archivo de texto y como un script. El script se pasará al ejecutable mencionado en la primera línea después del shebang. Voilà!
historia ligeramente más largo: Imagine que tiene la secuencia de comandos, foo.sh
, con el (x
) bit ejecutable. Este archivo contiene, p. lo siguiente:
#!/bin/sh
# some script commands follow...:
# *snip*
Ahora, en su shell, escriba:
> ./foo.sh
Editar: Lea también los comentarios a continuación después o antes de leer el siguiente! Como resultado, estaba equivocado. Aparentemente, no es el shell el que pasa el script al intérprete de destino, sino el sistema operativo (kernel) en sí mismo.
Recuerde que escribir esta dentro del proceso de la shell (Vamos a suponer que este es el programa /bin/sh
). Por lo tanto, esa entrada tendrá que ser procesada por ese programa. Interpreta esta línea como un comando, ya que descubre que lo primero que se ingresa en la línea es el nombre de un archivo que realmente existe y que tiene los bits ejecutables establecidos.
/bin/sh
luego comienza a leer el contenido del archivo y descubre el shebang (#!
) justo al comienzo del archivo. Para el shell, este es un token ("número mágico") por el cual sabe que el archivo contiene un script.
Ahora, ¿cómo sabe en qué lenguaje de programación está escrita la secuencia de comandos? Después de todo, puede ejecutar scripts Bash, scripts Perl, scripts de Python, ... Todo lo que el shell sabe hasta ahora es que está mirando un archivo de script (que no es un archivo binario, sino un archivo de texto). Por lo tanto, lee la siguiente entrada hasta el primer salto de línea (que dará como resultado /bin/sh
, compare con el anterior). Este es el intérprete al que se le pasará el script para su ejecución. (En este caso particular, el intérprete de destino es el intérprete de comandos, por lo que no tiene que invocar un nuevo intérprete de comandos para el guión, simplemente procesa el resto del archivo de guión).
Si el guión estaba destinado por ejemplo/bin/perl
, todo lo que el intérprete de Perl (opcionalmente) tendría que hacer es ver si la línea shebang realmente menciona el intérprete Perl. De lo contrario, el intérprete de Perl sabría que no puede ejecutar este script. Si de hecho el intérprete de Perl se menciona en la línea de shebang, lee el resto del archivo de guión y lo ejecuta.
He hecho una buena educación sobre este tema en el hilo comp.lang.shell [PostScript programas ejecutables] (http://groups.google. com/group/comp.unix.shell/browse_thread/thread/e7a3306342c01847/ec5741ed3278408a? q = ejecutable + postscript + programas # ec5741ed3278408a) Al escribir un simple programa C para manipular la línea de comandos, pude crear scripts ejecutables para un lenguaje que normalmente no hace eso. –