Que signifie la ligne «#! / Bin / sh» dans un script shell UNIX?

142

J'étais en train de parcourir des didacticiels de script shell et j'ai trouvé l'exemple de programme suivant:

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

Quelqu'un peut-il me dire quelle est la signification du commentaire #!/bin/shau début?

Jake
la source

Réponses:

143

Il s'appelle un 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 arrive dans cette ligne ne soit pas "pertinent" pour l'interpréteur spécifié. par exemple, tous les langages de script ont tendance à comprendre qu'une ligne commençant par #est un commentaire, et ignorent la !/usr/bin/whateverpartie, qui pourrait autrement être une erreur de syntaxe dans ce langage particulier.

Marc B
la source
6
C'est généralement le noyau, pas le shell, qui traite cela. Le shell appelle simplement l'appel exec()système sur le fichier.
tripleee
47

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 soi-disant «nombre magique», qui peut être utilisé pour décider du format du programme et comment l'exécuter.

#!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 texte et lit jusqu'au suivant \n(il y a une limite, mais ça 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 également des nombres magiques. Essayez de regarder un fichier bitmap (.BMP) via lesset vous verrez que les deux premiers caractères sont BM. Ce nombre magique indique que le fichier est en effet un bitmap.

Foo Bah
la source
10

Si le fichier dans lequel se trouve 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, c'est /bin/sh, par exemple.

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

Kusalananda
la source
5

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 (sortie en cas d'erreur), ou utiliser d'autres programmes (/ bin / awk, / usr / bin / perl, etc.).

Kevin
la source
-4

#!/bin/shou #!/bin/bashdoit être la première ligne du script car si vous ne l'utilisez pas sur la première ligne, le système traitera toutes les commandes de ce script comme des commandes différentes. Si la première ligne est #!/bin/shalors, il considérera toutes les commandes comme un seul script et il montrera que ce fichier s'exécute dans la pscommande et non dans les commandes à l'intérieur du fichier.

./echo.sh

ps -ef |grep echo
trainee   3036  2717  0 16:24 pts/0    00:00:00 /bin/sh ./echo.sh
root      3042  2912  0 16:24 pts/1    00:00:00 grep --color=auto echo
Sarvesh Pawar
la source
1
Stack Overflow n'est pas Twitter. Veuillez prendre le temps d'épeler des mots tels que «u» et «1er». Vous aidez à écrire un livre de référence, donc une grammaire et une orthographe appropriées sont importantes. Faites également attention au formatage approprié. Les commandes qui seraient émises à partir de la ligne de commande, comme ps, et les extraits de code comme #!/bin/shdevraient être formatées.
The Tin Man
J'ai essayé de nettoyer l'anglais ici mais je ne suis toujours pas sûr de ce que cela signifie. Je suppose que la réponse essaie de dire que les commandes du script seront exécutées en tant que commandes distinctes et que l'ajout d'un shebang affichera le script comme une seule commande dans une liste de processus. Ce n'est pas vraiment vrai.
tripleee