./file
ou sh file
? Les directives d'interpréteur permettent d'utiliser des scripts et des fichiers de données comme des commandes, caché les détails de leur implémentation à partir d'utilisateurs et d'autres programmes, en supprimant la nécessité de préfixer les scripts avec leur interpréteur sur la ligne de commande.
Un script de shell de Bourne identifié par le chemin de chemin/chemin/à/foo, a la ligne initiale,
#!/bin/sh -x
et est exécuté avec les paramètres Bar et Baz comme
some/path/to/foo bar baz
fournit un résultat similaire que d'avoir réellement exécuté la ligne de commande suivante à la place:
/bin/sh -x some/path/to/foo bar baz
Remarque: En 1980, Dennis Ritchie a introduit le support du noyau des directives d'interprète:
The system has been changed so that if a file being executed begins with the magic characters #! , the rest of the line is understood to be the name of an interpreter for the executed file. Previously (and in fact still) the Shell did much of this job; it automatically executed itself on a text file with executable mode when the text file's name was typed as a command. Putting the facility into the system gives the following benefits. 1) It makes Shell scripts more like real executable files, because they can be the subject of 'exec.' 2) If you do a 'ps' while such a command is running, its real name appears instead of 'sh'. Likewise, accounting is done on the basis of the real name. 3) Shell scripts can be set-user-ID.
Remarque: Linux ignore le bit SetUID sur tous les exécutables interprétés (I.E. Executables commençant par une ligne #!
4) It is simpler to have alternate shells available; e.g. if you like the Berkeley csh there is no question about which Shell is to interpret a file. 5) It will allow other interpreters to fit in more smoothly.
Plus d'informations :
La fonction du hashbang consiste à indiquer au noya quel programme fonctionner comme interprète de script lorsque le fichier est exécuté.
Fonctionnement ./program
fait exactement cela et nécessite une autorisation d'exécution sur le fichier, mais est agnostique au type de programme. Ce serait peut-être un script Bash, un script sh, un Perl, Python, Awk ou d'attendre un script, ou un exécutable binaire réel. Fonctionnement sh program
le forcerait à être exécuté sous sh
, au lieu de toute autre chose.
Notez que sh
est différent de bash
! Ce dernier a un certain nombre de fonctionnalités avancées non connues par la coque standard. Selon le système, sh
peut être un autre programme, ou Bash en mode de compatibilité, mais le résultat est généralement identique: toutes les fonctionnalités avancées sont inaccessibles.
Bash en elle-même ne comprend pas la ligne de hashbang, mais repose sur le noyau pour le lire. D'autre part, l'interprète Perl a également lu la ligne de hashbang par lui-même quelle que soit la manière dont il a été démarré: cela pourra choisir toutes les options de ligne de commande définies sur la ligne HASHBANG. Bash ne fait pas cela.
Par exemple, le script suivant a un comportement différent selon que s'il est démarré comme ./script
(via exec
et la ligne de hashbang), ou avec bash script
(exécution manuellement de l'interprète bash):
#!/bin/bash -u
echo $1
bash
lui-même n'attache aucun sens à la ligne Shebang, il ne le voit que comme un commentaire. Lorsque la coquille lit une ligne de commande, la commande est un programme externe (pas une commande interne comme cd
), il exécute la commande à l'aide de l'appel système execve
. Le noyau examine ensuite quel type d'exécutable le fichier transmis à execve
est en cochant le numéro magique au début du fichier. Si le numéro de magie est composé des deux octets 0x23 0x21 (caractères ASCII #!
), le noyau suppose qu'ils sont suivis de la voie absolue de l'interprète du script. Le noyau commence alors l'interprète, en passant le script.
Eh bien, pour être 100% précis, il n'ya pas grand chose à propos d'une "Bash Shebang". Un shebang peut apparaître sous différentes formes. C'est simplement une indication d'interprète. Donc, un shebang de, disons, #!/usr/bin/Perl
F.ex.ex. Soyez un "Perl Shebang" et indiquez l'interpréteur Perl comme interprète pour un tel schrupip. Vous pouvez ensuite appeler un tel script Perl comme n'importe quel script shell. Les mêmes représentent tout autre interprète de script. Cela pourrait être php, ou cshell, ou prologue, ou de base ou autre chose qui interprète les fichiers texte d'une manière ou d'une autre. Et bien sûr, l'interprète devrait être capable d'ignorer le shebang. Pour bash, c'est simplement une ligne de commentaire. La même chose est vraie pour php et perl. Je pense que Prologgerait cependant sur cette ligne. Le shebang devrait également fonctionner sans couture avec votre propre application, tant que cela est capable d'interpréter le texte et d'ignorer le shebang.
Ce serait intéressant si f.ex. Un interprète JavaScript serait capable d'ignorer un tel "JavaScript Shebang" :)