web-dev-qa-db-fra.com

Que signifie la ligne "#! / Bin / sh" dans un script UNIX Shell?

Je parcourais des tutoriels de script Shell et j'ai trouvé l'exemple de programme suivant:

#!/bin/sh
clear
echo "HELLO WORLD"

Quelqu'un peut-il dire s'il vous plaît quelle est la signification de mentionner '!/bin/sh' dans le commentaire?

133
Jake

Elle s'appelle Shebang et indique au shell parent quel interpréteur doit être utilisé pour exécuter le script.

par exemple.

#!/usr/bin/Perl   <--Perl script'
#!/usr/bin/php <-- php script
#!/bin/false <--- do-nothing script, because false returns immediately anyways.

Il est implémenté comme un commentaire afin que tout ce qui vient dans cette ligne ne soit pas "pertinent" pour l'interprète spécifié. par exemple. tous les langages de script ont tendance à comprendre qu'une ligne commençant par # est un commentaire et ignorera la partie !/usr/bin/whatever, qui pourrait sinon être une erreur de syntaxe dans ce langage particulier.

134
Marc B

Lorsque vous essayez d'exécuter un programme sous Unix (un avec le bit exécutable défini), le système d'exploitation examinera les premiers octets du fichier. Celles-ci forment le "nombre magique", qui peut être utilisé pour décider du format du programme et de son exécution.

#! correspond au nombre magique 0x2321 (recherchez-le dans une table ascii). Lorsque le système voit que le nombre magique, il sait qu'il s'agit d'un script de texte et lit jusqu'au prochain \n (il y a une limite, mais elle m'échappe atm). Après avoir identifié l'interprète (le premier argument après le Shebang), il appellera l'interprète.

D'autres fichiers ont aussi des nombres magiques. Essayez de regarder un fichier bitmap (.BMP) via less et vous verrez les deux premiers caractères sont BM. Ce nombre magique indique que le fichier est bien un bitmap.

43
Foo Bah

Si le fichier contenu dans ce script est exécutable, le hash-bang (#!) indique au système d'exploitation quel interpréteur utiliser pour exécuter le script. Dans ce cas, il s'agit de /bin/sh, par exemple.

Il y a un article Wikipedia à ce sujet pour plus d'informations.

8
Kusalananda

La première ligne indique au shell que si vous exécutez le script directement (./run.sh; par opposition à/bin/sh run.sh), il doit utiliser ce programme (/ bin/sh dans ce cas) pour l’interpréter.

Vous pouvez également l'utiliser pour passer des arguments, généralement -e (exit en cas d'erreur), ou utiliser d'autres programmes (/ bin/awk,/usr/bin/Perl, etc.).

5
Kevin