Pourquoi la "she-bang" commence-t-elle par #!
, comme #!/bin/bash
? J'ai toujours accepté que c'est ainsi que cela se fait, mais y a-t-il une raison derrière cela?
Pourquoi commencer par #
; n'est-ce pas habituellement un commentaire? Ou est-ce le point qu'il faudrait commenter?
#!
(autant que dmr s'en souvient…), y compris une explication de la raison pour laquelle#
(oui, la ligne a dû être ignorée par les obus existants).Réponses:
En règle générale, shebang se réfère uniquement à
#!
(!
est généralement appelé "bang", et il semble que "elle" soit une corruption de "SHArp" ou de "haSH" pour#
) - toute la ligne est appelée une ligne de shebangIl commence intentionnellement par un caractère de commentaire pour une compatibilité descendante avec des choses qui ne savent pas comment le gérer; le
!
est probablement pour le distinguer d'un commentaire aléatoire démarrant le fichier, donc un fichier qui commence par# this is my script!
n'essaie pas d'exécuter l'this is my script!
interpréteurla source
!
est souvent utilisé dans d'autres contextes pour indiquer une commande à exécuter. Par exemple, dansvim
ou dans d' autres programmes avec leurs propres lignes de commande, bang est souvent le caractère d'échappement qui les fait exécuter la commande dans un shell système au lieu de leur interface interne.Pour comprendre cela, vous devez comprendre que la première ligne du script est en fait lue deux fois , par 2 programmes différents. La première fois, le noyau ouvre le fichier et recherche cette séquence de caractères (
#!
) sur la première ligne. S'il le trouve, il exécute le programme shell qui y est indiqué, en passant le nom de fichier en paramètre. (par exemple, si le fichier/home/me/foo
commence par#!/bin/sh
, le noyau s'exécutera/bin/sh /home/me/foo
).Ensuite, le shell (
bin/sh
ou le programme d'interprétation spécifié) lit le fichier. Le shell ne sait rien des lignes de shebang mais il lira toujours la première ligne car il ressemble à n'importe quelle autre ligne du fichier ... il les lit toutes. Vous ne voulez pas que le shell plante ou modifie son comportement de quelque manière que ce soit ... la façon de le faire est de le faire traiter comme un commentaire et de l'ignorer. Ainsi, le meilleur caractère pour commencer une instruction du noyau serait le caractère de commentaire.la source
Il doit s'agir d'un commentaire, car de cette manière uniquement, il fonctionnera également pour exécuter un script tel que "interprétername scriptname". Je ne connais pas l'origine du "!".
la source