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

J’ai déjà fait des scripts Bash et ils se sont tous bien déroulés sans cela au début. A quoi ça sert de le mettre? Les choses seraient-elles différentes?

Aussi, comment prononcez-vous # ? Je le sais ! se prononce comme “bang”.

Comment est #! prononcé?

C’est une convention, donc le shell * nix sait quel type d’interpréteur exécuter.

Par exemple, les anciennes versions de ATT par défaut étaient sh (le shell Bourne), tandis que les anciennes versions de BSD utilisaient 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. Par exemple, vous pourriez 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 que – sous * nix, associer un suffixe à un type de fichier est simplement une convention et non une “règle” . Un exécutable peut être un programme binary, un million de types de script et d’autres choses. D’où la nécessité de #!/bin/bash .

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

Il doit être suivi d’un chemin de fichier d’un exécutable interpréteur (que BTW pourrait même être relatif, mais le plus souvent absolu).

Un bon truc (ou peut-être pas si sympa ) de trouver un interpréteur (par exemple python ) dans le $PATH de l’utilisateur est d’utiliser le programme env (toujours à /usr/bin/env sur tous les 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 ce serait souvent inutile)

C’est ce qu’on appelle un shebang . En langage unix, # s’appelle sharp (comme en musique) ou hash (comme les hashtags sur twitter), et! est appelé bang. (Vous pouvez réellement référencer votre commande shell précédente avec !!, appelée bang-bang). Donc, quand ils sont mis ensemble, 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, la ligne est donc ignorée lors de l’exécution suivante.

Le shebang est une directive au chargeur d’utiliser le programme qui est spécifié après le #! en tant qu’interprète pour le fichier en question lorsque vous essayez de l’exécuter. Donc, si vous essayez d’exécuter un fichier nommé foo.sh qui a #!/bin/bash en haut, la commande qui s’exécute est /bin/bash foo.sh C’est un moyen flexible d’utiliser différents interprètes pour différents programmes. Ceci est quelque chose implémenté au niveau du système et l’API de niveau utilisateur est la convention de shebang.

Il est également intéressant de savoir que le shebang est un nombre magique – un nombre lisible par l’homme qui identifie le fichier en tant que script pour l’interprète donné.

Votre remarque à ce sujet “travailler” 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 #! /usr/bin/js (ou quelque chose de similaire) pour avoir un “script shell” javascript.

Le système d’exploitation utilise le 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 également utile pour la portabilité .

Chaque dissortingbution a un shell par défaut. Bash est le défaut sur la majorité des systèmes. Si vous travaillez sur un système qui a 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 comme 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 dans le script.

#! est souvent appelé “hash-bang”, “she-bang” ou “sha-bang”.

Cela s’appelle un shebang . Il se compose d’un signe numérique et d’un point d’exclamation (#!), Suivi du chemin d’access 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.

Cela peut être utile à quelqu’un qui utilise un système différent qui n’a pas cette bibliothèque facilement disponible. Si ce n’est pas déclaré et que vous avez des fonctions dans votre script qui ne sont pas sockets en charge par ce système, vous devez déclarer # / bin / bash. Je me suis heurté à ce problème avant au travail et maintenant je l’inclus juste comme pratique.