C'est une convention pour que le shell *nix sache quel type d'interpréteur exécuter.
Par exemple, les versions plus anciennes d'ATT étaient par défaut sh (le shell Bourne), alors que les anciennes versions de BSD étaient par défaut csh (le shell C).
Même aujourd'hui (où la plupart des systèmes exécutent bash, le "Bourne Again Shell" ), les scripts peuvent être en bash, python, perl, ruby, PHP, etc, etc. Par exemple, vous pouvez voir #!/bin/perl
ou #!/bin/perl5
.
PS :Le point d'exclamation (!
) est affectueusement appelé "bang" . Le symbole de commentaire du shell (#
) est parfois appelé "hachage" .
PPS :Rappelez-vous - sous *nix, associer un suffixe à un type de fichier n'est qu'une convention , pas une "règle" . Un exécutable peut être un programme binaire, n'importe lequel d'un million de types de scripts et d'autres choses également. D'où la nécessité de #!/bin/bash
.
Pour être plus précis le shebang #!
, lorsqu'il s'agit des deux premiers octets d'un exécutable (x
mode), est interprété par l'appel système execve(2) (qui exécute des programmes). Mais spécification POSIX pour execve
ne mentionnez pas le shebang.
Il doit être suivi d'un chemin de fichier d'un exécutable d'interpréteur (qui BTW pourrait même être relatif, mais le plus souvent absolu).
Une bonne astuce (ou peut-être pas si bonne) pour trouver un interpréteur (par exemple python
) dans le $PATH
de l'utilisateur est d'utiliser le env
programme (toujours à /usr/bin/env
sur tous les Linux) comme par exemple
#!/usr/bin/env python
Tout exécutable ELF peut être un interpréteur. Vous pouvez même utiliser #!/bin/cat
ou #!/bin/true
si tu voulais ! (mais ce serait souvent inutile)
Ça s'appelle un shebang. En langage Unix, # est appelé sharp (comme dans la musique) ou hash (comme les hashtags sur Twitter), et ! s'appelle bang. (Vous pouvez en fait référencer votre commande shell précédente avec !!, appelée bang-bang). Ainsi, une fois assemblés, vous obtenez du haSH-BANG, ou du shebang.
La partie après le # ! indique à Unix quel programme utiliser pour l'exécuter. S'il n'est pas spécifié, il essaiera avec bash (ou sh, ou zsh, ou quelle que soit votre variable $SHELL) mais s'il est là, il utilisera ce programme. De plus, # est un commentaire dans la plupart des langues, donc la ligne est ignorée lors de l'exécution suivante.