web-dev-qa-db-fra.com

Pourquoi avez-vous besoin de mettre #! / Bin / bash au début d'un fichier de script?

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 #!?

449
node ninja

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.

393
paulsm4

Pour être plus précis, Shebang#!, quand il s’agit des deux premiers octets d’un exécutable (xmode ), 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)

123

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.

47
austin1howard

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é .

16
Balaswamy Vaddeman

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.

16
Noufal Ibrahim

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".

14
jaypal singh

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.

9
Uday Sawant

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 .

1
star

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.

0
Beardy