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

j'ai fait Bash scripts avant et ils ont tous fonctionné bien sans cela au début. Quel est le point de mettre dans? La situation serait-elle différente?

aussi, comment prononcez-vous # ? Je sais que ! se prononce comme" bang."

comment se prononce #! ?

390
demandé sur Peter Mortensen 2012-01-23 10:24:31

8 réponses

c'est une convention donc l'interpréteur *nix sait quel type d'interpréteur exécuter.

par exemple, les anciennes saveurs de ATT sont passées par défaut à sh (la coque Bourne), tandis que les anciennes versions de BSD sont passées par défaut à csh (la coque C).

même aujourd'hui (où la plupart des systèmes fonctionnent bash, le " Bourne Again Shell " ), les scripts peuvent être en bash, python, perl, ruby, PHP, etc, etc. Par exemple, vous voir #!/bin/perl ou #!/bin/perl5 .

PS: Le point d'exclamation ( ! ) est affectueusement appelé "bang" . Le symbole de commentaire de l'interpréteur de commandes ( # ) est parfois appelé "hash .

Spa: Rappelez-vous-sous *nix, associer un suffixe à un type de fichier est simplement une convention , pas une règle . Un exécutable peut être un programme binaire, n'importe lequel d'un million de types de script et d'autres choses aussi bien. D'où la nécessité de #!/bin/bash .

349
répondu paulsm4 2017-09-26 17:00:30

pour être plus précis le shebang #! , quand il s'agit des deux premiers octets d'un exécutable ( x mode ) est interprété par l'appel système execve(2) (qui exécute les programmes). Mais spécification POSIX pour execve ne pas mentionner le shebang.

Il doit être suivi par un chemin de fichier d'un interprète exécutable (qui peut même être relatif, mais le plus souvent absolu).

une bonne astuce (ou peut-être pas si agréable un) pour trouver un interprète (par exemple python ) dans le $PATH de l'utilisateur est d'utiliser le programme env (toujours à /usr/bin/env sur tous Linux) comme par exemple

 #!/usr/bin/env python

tout exécutable ELF peut être un interpréteur. Vous pouvez même utiliser #!/bin/cat ou #!/bin/true si vous le souhaitez! (mais que serait souvent inutile)

117
répondu Basile Starynkevitch 2017-08-20 18:33:18

ça s'appelle un shebang . Dans unix-speak, # s'appelle sharp (comme en musique) ou hash (comme les hashtags sur twitter), et ! est appelé bang. (Vous pouvez référencer votre commande shell précédente avec !! appelé bang-bang). Donc, une fois assemblé, vous obtenez haSH-BANG, ou shebang.

La partie après le #! raconte Unix quel programme utiliser pour l'exécuter. Si elle n'est pas spécifiée, elle essaiera avec bash (ou sh, Ou zsh, ou quelque soit votre variable $ SHELL)) mais s'il est là, il utilisera ce programme. De plus, # est un commentaire dans la plupart des langues, donc la ligne est ignorée lors de l'exécution suivante.

45
répondu austin1howard 2012-01-23 06:34:49

Le shebang est une directive à la chargeur pour utiliser le programme spécifié après le #! comme interprète pour le fichier en question lorsque vous essayez de l'exécuter. Donc, si vous essayez d'exécuter un fichier appelé foo.sh qui a #!/bin/bash au sommet, la commande qui s'exécute est /bin/bash foo.sh . C'est une façon flexible d'utiliser différents interprètes pour différents programmes. C'est quelque chose mis en œuvre au niveau du système et au niveau de l'utilisateur API est la convention de shebang.

il est également intéressant de savoir que le shebang est un numéro magique - un humain lisible qui identifie le fichier comme un script pour l'interpréteur donné.

votre point de vue à ce sujet" travailler " même sans le shebang est seulement parce que le programme en question est un script shell écrit pour le même shell que celui que vous utilisez. Par exemple, vous pouvez très bien écrire un fichier javascript et puis mettre un #! /usr/bin/js (ou quelque chose de similaire) pour avoir un"script Shell" javascript.

16
répondu Noufal Ibrahim 2012-01-23 06:36:50

le système d'exploitation prend shell par défaut pour exécuter votre script shell. donc, en mentionnant le chemin du shell au début de script, vous demandez au système D'exploitation d'utiliser ce shell particulier. Il est également utile pour portabilité .

15
répondu Balaswamy Vaddeman 2015-03-11 18:13:10

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 qui a un shell par défaut différent, alors les scripts pourraient 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 .

ajout de #!/bin/bash comme première ligne de votre script, dit au système D'exploitation d'invoquer le shell pour exécuter les commandes qui suivent dans le script.

#! est souvent désigné comme un "hash-bang", "she-bang" ou "sha-bang".

13
répondu jaypal singh 2015-03-11 17:47:01

, Il est appelé shebang . Il se compose d'un signe de nombre et d'un caractère de point d'exclamation (#!), suivi du chemin complet vers l'interpréteur tel que /bin / bash. Tous les scripts sous UNIX et Linux s'exécutent en utilisant l'interpréteur spécifié sur une première ligne.

9
répondu Uday Sawant 2012-01-23 06:36:27

il peut être utile à quelqu'un qui utilise un système différent qui n'a pas cette bibliothèque facilement disponible. Si cela n'est pas déclaré et que vous avez des fonctions dans votre script qui ne sont pas supportées par ce système, vous devez déclarer #/bin/bash. J'ai déjà rencontré ce problème au travail et maintenant je l'inclus comme un entraînement.

0
répondu Beardy 2015-03-11 18:28:15