GNU/Linux >> Tutoriels Linux >  >> Linux

Qu'est-ce que Shebang dans Linux Shell Scripting ?

Vous rencontrerez souvent des scripts shell commençant par :

#!/bin/bash

Ce #! est appelé shebang ou hashbang. Le shebang joue un rôle important dans les scripts shell, en particulier lorsqu'il s'agit de différents types de shell.

Dans ce didacticiel, vous apprendrez :

  • Qu'est-ce que Shebang ?
  • En quoi joue-t-il un rôle important dans les scripts shell ?

Qu'est-ce que le shebang dans les scripts shell ?

Le shebang est la combinaison du # (dièse) et ! (point d'exclamation). Cette combinaison de caractères a une signification particulière lorsqu'elle est utilisée dans la toute première ligne du script. Il est utilisé pour spécifier l'interpréteur avec lequel le script donné sera exécuté par défaut.

Ainsi, si la première ligne d'un script est :

#!/bin/bash

Cela signifie que l'interpréteur doit être bash shell. Si la première ligne est :

#!/bin/zsh

Cela signifie que l'interpréteur à utiliser est le shell Z.

Le #! est sûrement spécial car # est utilisé pour les commentaires dans les scripts shell mais ici il a une signification particulière.

Pourquoi le shebang est-il important dans les scripts shell ?

Voici la chose. Le shebang suivi de l'exécutable du shell n'est pas obligatoire pour un script.

Si vous écrivez un script simple comme celui-ci :

echo "Namaste, folks!"

Et donnez-lui l'autorisation d'exécution et exécutez-le avec le . opérateur, il sera exécuté par votre shell de connexion.

[email protected]:~$ cat sample 
echo "Namaste, folks!"
[email protected]:~$ chmod u+x sample 
[email protected]:~$ ./sample 
Namaste, folks!

Alors pourquoi les scripts shell incluent-ils la ligne #!/bin/bash au début du script ?

Parce qu'il existe plusieurs shells disponibles pour les systèmes Linux et UNIX. Bien que ces shells aient pour la plupart une syntaxe commune, ils ont une syntaxe différente ou une manière différente de gérer les choses.

C'est pourquoi il devient important de spécifier le bon interpréteur de shell dans le script, sinon certains scripts peuvent produire des résultats différents lorsqu'ils sont exécutés dans différents shells.

Laissez-moi vous montrer cela avec un exemple simple.

Importance de spécifier l'interpréteur shell avec shebang

J'ai écrit un exemple de script shell avec un tableau de distributions. Le script affiche alors la distribution à l'index 2.

distros=("Ubuntu" "Fedora" "SUSE" "Debian")
echo "Distro at index 2 is: ${distros[2]}"

Je n'ai pas ajouté la ligne shebang pour spécifier un interpréteur shell. Cela signifie que lorsque j'exécute ce script, il sera exécuté par le shell par défaut (bash dans mon cas) :

[email protected]:~$ echo $0
bash

Pouvez-vous deviner la sortie du script ?

[email protected]:~$ ./arrays.sh 
Distro at index 2 is: SUSE

Il affiche SUSE à l'index 2 car l'index de tableau commence à 0 dans Bash et dans de nombreux autres langages de programmation et de script. MAIS ce n'est pas le cas dans le shell Z. Dans le shell Z, l'index du tableau commence à 1.

J'ai Z shell installé sur mon système. Je modifie le script et ajoute la ligne shebang pour spécifier que le script doit être exécuté par Z shell par défaut.

#!/bin/zsh

distros=("Ubuntu" "Fedora" "SUSE" "Debian")
echo "Distro at index 2 is: ${distros[2]}"

Pouvez-vous deviner le résultat lorsque j'exécute le script maintenant ?

[email protected]:~$ ./arrays.sh 
Distro at index 2 is: Fedora

Remarquez-vous la différence maintenant? C'est le même script mais l'ajout de la ligne shebang a fait la différence.

Et c'est pourquoi il est important de spécifier le bon interpréteur de shell avec l'opérateur shebang. En tant qu'administrateur système, vous pouvez écrire des scripts shell en gardant à l'esprit un shell spécifique, que ce soit bash, ksh ou zsh. Mais vous ne pouvez pas être sûr que le système qui exécutera le script aura le même shell par défaut que le vôtre. Maintenant, les choses ont un sens, n'est-ce pas ?

Shebang est ignoré si vous spécifiez explicitement shell

Pourquoi est-ce que j'insiste sur le shell "par défaut" ? Parce que le shebang spécifie l'interpréteur avec lequel exécuter le script.

Vous pouvez cependant spécifier explicitement le shell et dans ce cas, la ligne shebang sera ignorée.

Comment fonctionne exactement le shebang ?

Lorsque vous utilisez le shebang dans la première ligne d'un script, vous dites au shell d'exécuter le script donné avec la commande spécifiée.

En gros, #!/bin/zsh est équivalent à :

/bin/zsh script_name

Je vous ai dit que si la première ligne d'un script commence par shebang, cela signifie que vous spécifiez l'interpréteur shell.

Ce n'est que partiellement vrai. En fait, c'est le but du personnage de shebang. Mais il n'est pas nécessaire que la ligne shebang ait l'exécutable d'un shell. Cela peut être n'importe quoi.

Par exemple, je vais remplacer #!/bin/zsh avec #!/bin/cat . /bin/cat est l'exécutable de la commande cat.

#!/bin/cat

distros=("Ubuntu" "Fedora" "SUSE" "Debian")
echo "Distro at index 2 is: ${distros[2]}"

Cela signifie que maintenant ce script s'exécutera avec cat commande et affiche le contenu du script.

Cela fonctionnera tant qu'il pointe vers une commande exécutable. Si vous mettez des éléments aléatoires, cela générera une erreur.

Je change la ligne shebang en :

#!/home/abhishek

De toute évidence, il ne pointe vers l'exécutable d'aucune commande et génère donc une mauvaise erreur d'interpréteur.

[email protected]:~$ cat arrays.sh 
#!/home/abhishek

distros=("Ubuntu" "Fedora" "SUSE" "Debian")
echo "Distro at index 2 is: ${distros[2]}"
[email protected]:~$ ./arrays.sh 
bash: ./arrays.sh: /home/abhishek: bad interpreter: Permission denied

Conclusion

Permettez-moi de répondre à quelques questions supplémentaires avant de terminer cet article :

  • Il est important qu'il n'y ait pas d'espace entre # et ! . Vous NE POUVEZ PAS l'utiliser comme ceci :# !/bin/bash .
  • La plupart des systèmes autorisent un espace entre #! et /bin/bash cependant, il est recommandé d'éviter les espaces entre #! et /bin/bash .
  • #! doit être sur la première ligne, sinon la ligne shebang sera traitée comme un commentaire. Vous ne pouvez même pas avoir une ligne vide devant.

J'espère que vous comprenez mieux pourquoi # ! est utilisé au début des scripts shell sous Linux. N'hésitez pas à laisser un commentaire si vous avez des questions ou des suggestions.


Linux
  1. 4 façons d'exécuter un script shell sous UNIX / Linux

  2. Que sont les scripts shell ? Comment créer des scripts shell ?

  3. Qu'est-ce que l'utilisation () dans les scripts shell ?

  4. Que fait % dans les chaînes du shell Linux ?

  5. Créer des modèles avec Linux dans un script Shell ?

Qu'est-ce que le Shell sous Linux ?

Comment stocker une commande Linux en tant que variable dans un script shell

Comment exécuter un script Shell en tant que service SystemD sous Linux

Imprimer le temps d'exécution du script Shell sous Linux

Qu'est-ce que le sous-shell sous Linux ?

Qu'est-ce que le shell de connexion sous Linux ?