¿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?
#!
(tanto como dmr recuerda ...), incluida una explicación de por qué#
(sí, la línea tuvo que ser ignorada por los shells existentes).Respuestas:
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 elthis is my script!
intérpretefuente
!
se usa a menudo en otros contextos para indicar un comando que se ejecutará. Por ejemplo, envim
u 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.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/foo
comienza con#!/bin/sh
, el núcleo se ejecutará/bin/sh /home/me/foo
).A continuación, el shell (
bin/sh
o 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.fuente
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 "!".
fuente