J'ai déjà fait Bash scripts et ils fonctionnaient tous bien sans cela au début. Quel est l'intérêt de le mettre? Les choses seraient-elles différentes?
Aussi, comment prononcez-vous #
? Je sais que !
se prononce comme "bang".
Comment se prononce #!
?
C'est une convention pour que * nix Shell connaisse le type d'interprète à exécuter.
Par exemple, les anciennes versions d'ATT utilisaient par défaut sh (le Bourne Shell), tandis que les anciennes versions de BSD utilisaient par défaut csh (le C shell).
Même aujourd'hui (où la plupart des systèmes utilisent bash, le "Bourne Again Shell"), les scripts peuvent être en bash, python, Perl, Ruby, PHP, etc. Par exemple, vous pouvez voir #!/bin/Perl
ou #!/bin/Perl5
.
PS: Le point d'exclamation (!
) est appelé affectueusement "bang". Le symbole de commentaire du shell (#
) est parfois appelé "hash".
PPS: Rappelez-vous - sous * nix, associer un suffixe à un type de fichier est simplement un convention, pas un "règle". Un exécutable peut être un programme binaire, n'importe lequel des millions de types de script et autres. D'où la nécessité de #!/bin/bash
.
Pour être plus précis, Shebang#!
, quand il s’agit des deux premiers octets d’un exécutable (x
mode ), est interprété par l'appel execve (2) (qui exécute des programmes). Mais spécification POSIX pour execve
ne mentionne pas le Shebang.
Il doit être suivi du chemin de fichier d'un exécutable interpréteur (BTW peut même être relatif, mais le plus souvent absolu).
Une bonne astuce (ou peut-être pas si jolie une) pour trouver un interprète (par exemple python
) dans le $PATH
de l'utilisateur consiste à utiliser le programme env
(toujours à /usr/bin/env
sur tout Linux) comme par exemple.
#!/usr/bin/env python
Tout exécutable ELF peut être un interprète. Vous pouvez même utiliser #!/bin/cat
ou #!/bin/true
si vous le souhaitez! (mais ce serait souvent inutile)
C'est ce qu'on appelle un Shebang . En langage Unix, # est appelé sharp (comme dans la musique) ou hash (comme les hashtags sur Twitter), et! s'appelle bang. (Vous pouvez réellement référencer votre commande Shell précédente avec !!, appelée bang-bang). Donc, quand on les met ensemble, on obtient haSH-BANG ou Shebang.
La partie après le #! indique à Unix quel programme utiliser pour l'exécuter. S'il n'est pas spécifié, il essaiera avec bash (ou sh, ou zsh, ou quelle que soit votre variable $ Shell), mais s'il existe, il utilisera ce programme. De plus, # est un commentaire dans la plupart des langues, de sorte que la ligne est ignorée lors de l'exécution suivante.
Le système d'exploitation utilise Shell par défaut pour exécuter votre script Shell. en mentionnant le chemin du shell au début du script, vous demandez au système d’exploitation d’utiliser ce shell particulier. C'est aussi utile pour portabilité .
Shebang indique au chargeur d'utiliser le programme spécifié après le #!
comme interpréteur du fichier en question lorsque vous essayez de l'exécuter. Donc, si vous essayez d’exécuter un fichier nommé foo.sh
qui contient #!/bin/bash
en haut, la commande qui s’exécute est /bin/bash foo.sh
. C'est une manière flexible d'utiliser différents interprètes pour différents programmes. C'est quelque chose qui est implémenté au niveau système et l'API au niveau utilisateur est la convention de Shebang.
Cela vaut également la peine de savoir que Shebang est un nombre magique - lisible par l'homme qui identifie le fichier en tant que script pour un interprète donné.
Votre remarque sur le fait de "fonctionner" même sans Shebang est uniquement due au fait que le programme en question est un script Shell écrit pour le même shell que celui que vous utilisez. Par exemple, vous pourriez très bien écrire un fichier javascript puis placer un #! /usr/bin/js
(ou quelque chose de similaire) pour avoir un "script shell" javascript.
Chaque distribution a un shell par défaut. Bash est la valeur par défaut sur la majorité des systèmes. Si vous travaillez sur un système ayant un shell par défaut différent, les scripts risquent de ne pas fonctionner comme prévu s'ils sont écrits spécifiquement pour Bash.
Bash a évolué au fil des ans en prenant le code de ksh
et sh
.
L'ajout de #!/bin/bash
en tant que première ligne de votre script indique au système d'exploitation d'appeler le Shell
spécifié pour exécuter les commandes qui suivent.
#!
est souvent appelé "hash-bang", "she-bang" ou "sha-bang".
C'est ce qu'on appelle un Shebang. Il se compose d'un signe numérique et d'un caractère de point d'exclamation (#!), Suivi du chemin d'accès complet à l'interpréteur, tel que/bin/bash. Tous les scripts sous UNIX et Linux s'exécutent à l'aide de l'interpréteur spécifié sur une première ligne.
Aussi, vous verrez d'autres paramètres après #!/Bin/bash, par exemple#!/bin/bash -v -x
lisez ceci pour avoir plus d'idées.
https://unix.stackexchange.com/questions/124272/what-do-the-arguments-v-and-x-mean-to-bash .
Cela peut être utile à quelqu'un qui utilise un système différent et ne dispose pas de cette bibliothèque. Si cela n'est pas déclaré et que certaines fonctions de votre script ne sont pas prises en charge par ce système, vous devez déclarer #/bin/bash. J'ai déjà rencontré ce problème au travail et maintenant je l'inclue simplement en tant que pratique.