¿Por qué el "she-bang" comienza con un "#!"?

10

¿Por qué el "she-bang" comienza con un #!, como #!/bin/bash? Siempre he aceptado que así es como se hace, pero ¿hay alguna razón detrás de esto?

¿Por qué empezar con #; ¿No es eso generalmente un comentario? ¿O es el punto de que debería ser un comentario?

Johan
fuente
44
Wikipedia tiene una historia bastante detallada de #!(tanto como dmr recuerda ...), incluida una explicación de por qué #(sí, la línea tuvo que ser ignorada por los shells existentes).
Gilles 'SO- deja de ser malvado'
Faltó para consultar wikipedia :)
Johan
1
Solo desearía que los proyectiles fueran lo suficientemente inteligentes como para quitar un CR / LF extraño si está allí ...;)
Aaron D. Marasco el

Respuestas:

16

Por lo general, shebang se refiere solo a #!( !normalmente se llama "bang", y parece que "ella" es una corrupción de "SHArp" o "haSH" #): toda la línea se llama línea shebang.

Comienza intencionalmente con un carácter de comentario para compatibilidad con versiones anteriores de cosas que no saben cómo manejarlo; el !es presumiblemente sólo para distinguirlo de un comentario al azar a partir del archivo, por lo que un archivo que comienza con # this is my script!no intenta ejecutar el this is my script!intérprete

Michael Mrozek
fuente
2
Bang !se usa a menudo en otros contextos para indicar un comando que se ejecutará. Por ejemplo, en vimu otros programas con sus propias líneas de comando, bang es a menudo el carácter de escape que les hace ejecutar el comando en un shell del sistema en lugar de su interfaz interna.
Caleb
4

Para entender esto, debes darte cuenta de que la primera línea del script se lee dos veces , por 2 programas diferentes. La primera vez, el núcleo abre el archivo y busca esa secuencia de caracteres ( #!) en la primera línea. Si lo encuentra, ejecuta el programa de shell que se indica allí, pasando el nombre del archivo como parámetro. (por ejemplo, si el archivo /home/me/foocomienza con #!/bin/sh, el núcleo se ejecutará /bin/sh /home/me/foo).

A continuación, el shell ( bin/sho el programa de interpretación especificado) lee el archivo. El shell no sabe nada acerca de las líneas shebang, pero seguirá leyendo la primera línea porque es como cualquier otra línea en el archivo ... las lee todas. No desea que el shell se bloquee o altere su comportamiento de ninguna manera ... la forma de hacerlo es hacerlo tratar como un comentario e ignorarlo. Por lo tanto, el mejor carácter para comenzar con una instrucción del núcleo sería el carácter de comentario.

JoelFan
fuente
¿Es realmente el núcleo que hace eso, suena como que es el shell actual se trabaja en que analizará el tinglado y luego empujar el guión
Johan
No ... es el núcleo mismo, en vivo y en persona. Funcionará incluso si no está utilizando un shell para ejecutar el script ... hay otras formas de ejecutar un archivo además de un shell ... por ejemplo desde un programa en C, utilizando la llamada al sistema "exec"
JoelFan
en.wikipedia.org/wiki/Shebang_(Unix)#Magic_number "#!" en ascii están los bytes 0x23 0x21 - cuando exec () ve estos bytes, el comportamiento es tratar el resto de la línea como una ruta hacia un intérprete.
Aaron McMillin
1

Debe ser un comentario porque solo de esta manera también funcionará para ejecutar un script como "interpretername scriptname". No sé sobre el origen del "!".

Sven Geggus
fuente
1
Incluso si solo ejecuta ./scriptname, el intérprete todavía ve la línea she-bang, por lo que aún debe ser un comentario.
psusi
1
O para ser más detallado: el shebang: '#!' está diseñado para que el intérprete no lo vea, por lo que debe comenzar con el comentario char '#'. En cambio, es 'visto' (e interpretado) por el conjunto de llamadas al sistema 'exec [lv] *' del núcleo.
arielf