Shebang

caractères #! dans l'en-tête d'un script Unix

Le shebang, représenté par #!, est un en-tête d'un fichier texte qui indique au système d'exploitation (de type Unix) que ce fichier est un script (ensemble de commandes) et non un fichier binaire ; sur la même ligne est précisé l'interpréteur permettant d'exécuter ce script.

Shebang

Son nom est possiblement un mot-valise pour sharp (dièse, désignant ici improprement le croisillon, #) et bang (désignant ici le point d'exclamation, !)[1]. On trouve aussi d'autres dénominations : sha-bang, shabang, she-bang, hash-bang.

Portabilité

modifier

Pour assurer la portabilité, ces caractères sont toujours positionnés au tout début du fichier. Sur un système compatible ASCII ou UTF-8, la séquence #! en début de fichier ne peut être codée que par deux suites d'octets : 0x23 0x21 (en ASCII ou UTF-8 sans BOM) ou 0xEF 0xBB 0xBF 0x23 0x21 (UTF-8 avec BOM). Cette séquence est considérée comme un « nombre magique » (magic number) par la facilité qu'elle offre.

L'existence d'un BOM en début de script n'est pas recommandée dans la mesure où les anciens systèmes Unix ne tolèrent pas ce caractère. La prise en compte de ce caractère est une opération complexe[2]. Pour être compatible avec un système ainsi limité, le développeur ne dispose que de deux possibilités : coder le script avec un codage dicté par le shebang, ou lancer l'interpréteur à chaque appel, sans passer par le shebang.

Fonctionnement

modifier

Tout de suite après le shebang se trouve un chemin d'accès (exemple : #!/bin/sh). Il est possible d'ajouter une espace entre le point d'exclamation et le début du chemin d'accès. Ainsi la séquence #! /bin/sh est valide et équivalente à #!/bin/sh. Le chemin d'accès est le chemin vers le programme qui interprète les commandes de ce script, qu'il soit un shell, un langage de script, un langage de programmation ou un utilitaire. On peut ajouter des options qu'il reconnaît (par exemple -x pour un shell pour afficher le détail de son exécution). Ensuite, cet interpréteur de commandes exécute les commandes du script, en commençant au début (ligne 1), en ignorant les commentaires.

Exemples de shebang :

#!/bin/sh -x
#!/bin/bash
#!/usr/bin/perl
#!/usr/bin/tcl
#!/bin/sed -f
#!/usr/awk -f
#!/usr/bin/python -O — Execute using Python with optimizations to code

Remarque

modifier

On peut utiliser la commande env au lieu d'un interpréteur de commandes pour chercher celui-ci dans le PATH (ce qui évite de devoir réécrire la première ligne des scripts si on doit les porter sur une autre machine par exemple) :

#!/usr/bin/env python

… mais le problème est que l'on risque de ne pas appeler la bonne version de l'interpréteur si plusieurs sont présentes sur la machine. Un moyen de pallier cela est de détailler le nom de l'interpréteur :

#!/usr/bin/env python2

Voire :

#!/usr/bin/env python2.7

À noter que ces commandes sont parfois équivalentes : ainsi, sur une machine où python 2.7 et python 3.0 sont installés, python2 sera généralement un lien symbolique vers python2.7. Par contre, on ne peut garantir vers quoi pointe python : sur certaines machines, il pointera vers python2, tandis que sur d'autres, il pourra pointer vers python3.

Notes et références

modifier
  1. (en) « shebang », sur catb.org, The Jargon File (consulté le ).
  2. (en) Markus Kuhn, « UTF-8 and Unicode FAQ for Unix/Linux: What different encodings are there? ».