Histoire courte: Le shebang (#!
) de la ligne est lue par le shell (par exemple, sh
, bash
, etc.) le système d'exploitation du programme loader. Alors qu'il a officiellement ressemble à un commentaire, le fait que ce sont les deux premiers octets d'un fichier des marques de l'intégralité du fichier comme un fichier texte et en tant que script. Le script sera transmis à l'exécutable mentionné sur la première ligne après le shebang. Voilà!
Légèrement plus long de l'histoire: Imaginez que vous avez votre script, foo.sh
, avec le bit d'exécution (x
) ensemble. Ce fichier contient par exemple les suivantes:
#!/bin/sh
# some script commands follow...:
# *snip*
Maintenant, sur votre coquille, vous tapez:
> ./foo.sh
Edit: Veuillez lire également les commentaires ci-dessous après ou avant de lire la suite! Comme il s'avère, j'ai eu tort. C'est apparemment pas le shell qui passe par le script à la cible interprète, mais le système d'exploitation (noyau) lui-même.
Rappelez-vous que vous tapez à l'intérieur du processus de shell (supposons que c'est le programme /bin/sh
). Par conséquent, que les contributions devront être traitées par le programme. Il interprète cette ligne de commande, car il découvre que la première chose est entré sur la ligne est le nom d'un fichier qui existe réellement et qui a le bit d'exécution(s) ensemble.
/bin/sh
puis commence à lire le contenu du fichier et découvre le shebang (#!
) dès le tout début du fichier. Pour la coquille, c'est un jeton ("nombre magique"), par laquelle elle sait que le fichier contient un script.
Maintenant, comment fait-il savoir quel langage de programmation le script est écrit? Après tout, vous pouvez exécuter des scripts Bash, Perl, Python scripts, ... Tout le shell sait jusqu'à présent, c'est qu'il est à la recherche à un fichier de script (qui n'est pas un fichier binaire, mais un fichier texte). Ainsi, il lit l'entrée suivante à la première rupture de ligne (qui sera résultat en /bin/sh
, à comparer ci-dessus). C'est l'interprète à laquelle le script sera transmis pour exécution. (Dans ce cas particulier, la cible de l'interprète est le shell lui-même, afin de ne pas avoir à invoquer un nouveau shell pour le script; il traite simplement le reste du fichier de script lui-même.)
Si le script était destiné, par exemple, /bin/perl
, tout ce que l'interpréteur Perl serait (éventuellement) avoir à faire est de regarder si la ligne shebang vraiment mentionne l'interpréteur Perl. Si non, l'interpréteur Perl sait qu'il ne peut pas exécuter ce script. Si, en effet, l'interpréteur Perl est mentionné dans la ligne shebang, il lit le reste du fichier de script et l'exécute.