J'ai déjà fait des scripts Bash et ils se sont tous bien déroulés sans #!/bin/bash
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 cela !
se prononce comme "coup".
Comment se #!
prononce?
./yourscript.extension
, par exemple,./helloworld.py
ou./helloworld.sh
, il recherchera l'interpréteur sur cette ligne supérieure, ce qui serait#!/bin/python
ou!#/bin/bash
, alors que lors de l'exécution du script commepython helloworld.py
, la première ligne ne sera pas observée car elle est commentée en dehors. Il s'agit donc d'une séquence spéciale pour le shell / noyau.Réponses:
C'est une convention donc le shell * nix sait quel type d'interprète exécuter.
Par exemple, les anciennes versions d'ATT par défaut étaient sh (le shell Bourne), tandis que les anciennes versions de BSD étaient par défaut csh (le shell C).
Même aujourd'hui (où la plupart des systèmes exécutent bash, le "Bourne Again Shell" ), les scripts peuvent être en bash, python, perl, ruby, PHP, etc., etc. Par exemple, vous pouvez voir
#!/bin/perl
ou#!/bin/perl5
.PS: Le point d'exclamation (
!
) est affectueusement appelé "bang" . Le symbole de commentaire du shell (#
) est parfois appelé "hachage" .PPS: N'oubliez pas - sous * nix, associer un suffixe à un type de fichier n'est qu'une convention , pas une "règle" . Un exécutable peut être un programme binaire, n'importe lequel d'un million de types de scripts et d'autres choses également. D'où la nécessité de
#!/bin/bash
.la source
execve(2)
appel système; donc le shebang est une convention de noyau , pas un shell.#!/bin/sh
des choses comme.profile
et d'autres choses qui fonctionne OnLoadPour ê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 des programmes). Mais la spécification POSIX pourexecve
ne mentionne pas le shebang.Il doit être suivi d'un chemin de fichier d'un exécutable d'interpréteur (que BTW pourrait même être relatif, mais le plus souvent est absolu).
Une bonne astuce (ou peut-être pas si agréable ) pour trouver un interprète (par exemple
python
) dans l'utilisateur$PATH
est d'utiliser leenv
programme (toujours/usr/bin/env
sur tous les Linux) comme par exempleTout exécutable ELF peut être un interpréteur. Vous pouvez même utiliser
#!/bin/cat
ou#!/bin/true
si vous le souhaitez! (mais ce serait souvent inutile)la source
#!/usr/bin/env
hack.#!/usr/bin/env bash -x
? Comment je fais ça ?#!/usr/bin/env bash -x
bash
est presque toujours au/bin/bash
point donc votre cul devrait l'être#!/bin/bash -x
Cela s'appelle un shebang . Dans unix-parler, # est appelé sharp (comme dans la musique) ou hash (comme les hashtags sur twitter), et! est appelé bang. (Vous pouvez en fait 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 #! 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 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.
la source
execve(2)
syscall n'utilise pas la$SHELL
variable. C'est le noyau qui interprète le shebang.Le shebang est une directive adressée au chargeur pour 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 appeléfoo.sh
qui a#!/bin/bash
en haut, la commande réelle qui s'exécute est/bin/bash foo.sh
. Il s'agit d'une manière flexible d'utiliser différents interprètes pour différents programmes. C'est quelque chose implémenté au niveau du système et l'API au niveau de l'utilisateur est la convention shebang.Il convient également de savoir que le shebang est un nombre magique - un chiffre lisible par l'homme qui identifie le fichier comme un script pour l'interpréteur donné.
Votre point à ce sujet "fonctionne" même sans le shebang est uniquement parce 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 mettre un
#! /usr/bin/js
(ou quelque chose de similaire) pour avoir un "script shell" javascript.la source
Le système d'exploitation utilise le shell par défaut pour exécuter votre script shell. donc en mentionnant le chemin du shell au début du script, vous demandez au système d'exploitation d'utiliser ce shell particulier. Il est également utile pour la portabilité .
la source
Chaque distribution a un shell par défaut. Bash est la valeur par défaut sur la plupart des systèmes. S'il vous arrive de travailler sur un système qui a un shell par défaut différent, les scripts peuvent 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
etsh
.L'ajout en
#!/bin/bash
tant que première ligne de votre script, indique au système d'exploitation d'appeler le spécifiéshell
pour exécuter les commandes qui suivent dans le script.#!
est souvent appelé "hash-bang", "she-bang" ou "sha-bang".la source
Cela s'appelle un shebang . Il se compose d'un signe numérique 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 à l'aide de l'interpréteur spécifié sur une première ligne.
la source
Vous verrez également quelques autres paramètres après #! / Bin / bash, par exemple
#!/bin/bash -v -x
lisez ceci pour avoir plus d'idée.
/unix/124272/what-do-the-arguments-v-and-x-mean-to-bash .
la source
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 certaines fonctions de votre script ne sont pas prises en charge par ce système, vous devez déclarer # / bin / bash. J'ai rencontré ce problème avant au travail et maintenant je l'inclus comme pratique.
la source