È una convenzione in modo che la shell *nix sappia che tipo di interprete eseguire.
Ad esempio, versioni precedenti di ATT erano impostate per impostazione predefinita su sh (la shell Bourne), mentre le versioni precedenti di BSD avevano come impostazione predefinita csh (la shell C).
Ancora oggi (dove la maggior parte dei sistemi esegue bash, la "Bourne Again Shell" ), gli script possono essere in bash, python, perl, ruby, PHP, ecc. ecc. Ad esempio, potresti vedere #!/bin/perl
o #!/bin/perl5
.
PS:Il punto esclamativo (!
) è chiamato affettuosamente "bang" . Il simbolo del commento della shell (#
) è talvolta chiamato "hash" .
PPS:Ricorda:sotto *nix, associare un suffisso a un tipo di file è solo una convenzione , non una "regola" . Un eseguibile può essere un programma binario, uno qualsiasi dei milioni di tipi di script e anche altre cose. Da qui la necessità di #!/bin/bash
.
Per essere più precisi lo shebang #!
, quando sono i primi due byte di un eseguibile (x
mode), viene interpretato dalla chiamata di sistema execve(2) (che esegue i programmi). Ma la specifica POSIX per execve
non menzionare lo shebang.
Deve essere seguito da un percorso file di un eseguibile dell'interprete (che a proposito potrebbe anche essere relativo, ma molto spesso è assoluto).
Un bel trucco (o forse meno carino) per trovare un interprete (es. python
) nel $PATH
dell'utente è usare il env
program (sempre in /usr/bin/env
su tutti i Linux) come ad es.
#!/usr/bin/env python
Qualsiasi eseguibile ELF può essere un interprete. Potresti anche usare #!/bin/cat
o #!/bin/true
se lo volessi! (ma spesso sarebbe inutile)
Si chiama shebang. In unix-speak, # è chiamato sharp (come nella musica) o hash (come gli hashtag su Twitter), e ! si chiama botto. (Puoi effettivamente fare riferimento al tuo precedente comando di shell con !!, chiamato bang-bang). Quindi, una volta messi insieme, ottieni hasH-BANG, o shebang.
La parte dopo il #! dice a Unix quale programma usare per eseguirlo. Se non è specificato, proverà con bash (o sh, o zsh, o qualunque sia la tua variabile $SHELL) ma se è lì userà quel programma. Inoltre, # è un commento nella maggior parte delle lingue, quindi la riga viene ignorata nella successiva esecuzione.