Es una convención, por lo que *nix Shell sabe qué tipo de intérprete ejecutar.
Por ejemplo, las versiones anteriores de ATT tenían como valor predeterminado sh (el shell de Bourne), mientras que las versiones anteriores de BSD tenían como valor predeterminado csh (la capa C).
Incluso hoy (donde la mayoría de los sistemas ejecutan bash, el "Bourne Again Shell" ), los scripts pueden estar en bash, python, perl, ruby, PHP, etc., etc. Por ejemplo, es posible que vea #!/bin/perl
o #!/bin/perl5
.
PD:El signo de exclamación (!
) se llama cariñosamente "bang" . El símbolo de comentario de shell (#
) a veces se llama "hash" .
PPS:Recuerde:bajo *nix, asociar un sufijo con un tipo de archivo es simplemente una convención , no una "regla" . Un ejecutable puede ser un programa binario, cualquiera de un millón de tipos de secuencias de comandos y otras cosas también. De ahí la necesidad de #!/bin/bash
.
Para ser más precisos, el shebang #!
, cuando son los dos primeros bytes de un ejecutable (x
mode), es interpretado por la llamada al sistema execve(2) (que ejecuta programas). Pero la especificación POSIX para execve
no menciones el tinglado.
Debe ir seguido de una ruta de archivo de un ejecutable de intérprete (que, por cierto, podría incluso ser relativo, pero la mayoría de las veces es absoluto).
Un buen truco (o tal vez no tan bueno) para encontrar un intérprete (por ejemplo, python
) en el $PATH
del usuario es usar el env
programa (siempre en /usr/bin/env
en todos los Linux) como, por ejemplo,
#!/usr/bin/env python
Cualquier ejecutable ELF puede ser un intérprete. Incluso podrías usar #!/bin/cat
o #!/bin/true
¡Si quieres! (pero eso sería a menudo inútil)
Se llama tinglado. En lenguaje Unix, # se llama sostenido (como en la música) o hash (como los hashtags en Twitter) y ! se llama explosión. (¡Puede hacer referencia a su comando de shell anterior con !!, llamado bang-bang). Entonces, cuando se juntan, obtienes haSH-BANG, o shebang.
La parte después del #! le dice a Unix qué programa usar para ejecutarlo. Si no se especifica, intentará con bash (o sh, o zsh, o cualquiera que sea su variable $SHELL), pero si está allí, usará ese programa. Además, # es un comentario en la mayoría de los idiomas, por lo que la línea se ignora en la ejecución posterior.