43 votes

Bash Shebang pour les débutants?

J'ai quelques scripts bash que j'ai configurés qui utilisent principalement

#!/bin/bash

mais je rencontre régulièrement certains qui ressemblent à ceci

#!/bin/bash -e
#!/bin/bash -x
#!/bin/bash -ex

et ainsi de suite.

Est-ce que quelqu'un peut expliquer le sens et les avantages de ces options de shebang et si elles s'appliquent à d'autres shebangs ?

46voto

Si un script /chemin/vers/foo commence par #!/bin/bash, alors l'exécution de /chemin/vers/foo arg1 arg2 est équivalente à l'exécution de /bin/bash /chemin/vers/foo arg1 arg2. Si la ligne shebang est #!/bin/bash -ex, cela équivaut à exécuter /bin/bash -ex /chemin/vers/foo arg1 arg2. Cette fonctionnalité est gérée par le noyau.

Remarquez que vous ne pouvez portez qu'un seul argument sur la ligne shebang : certains Unix (comme Linux) n'acceptent qu'un seul argument, de sorte que #!/bin/bash -e -x mènerait à l'envoi à bash de l'unique argument de cinq caractères -e -x (une erreur de syntaxe) au lieu de deux arguments -e et -x.

Pour le shell Bourne sh et les shells dérivés tels que le sh POSIX, bash, ksh et zsh :

  • -e signifie que si une commande échoue (ce qu'elle indique en retournant un statut différent de zéro) le script se terminera immédiatement.
  • -x fait en sorte que le shell imprime une trace d'exécution.

D'autres programmes peuvent comprendre ces options mais avec des significations différentes.

24voto

cYrus Points 20338

Ils sont des options passées à bash voir aide set pour plus d'infos, dans ce cas :

-x  Imprimer les commandes et leurs arguments tel qu'ils sont exécutés.
-e  Quitter immédiatement si une commande se termine avec un statut non nul.

0voto

Zhuiguang Liu Points 101

Je voudrais simplement mentionner une alternative encore meilleure - comme étant plus portable - :

#!/usr/bin/env bash

L'exemple ci-dessus utilise env pour trouver l'exécutable bash, qui n'est pas toujours situé à /bin/bash. Les anciens scripts #!/bin/bash ne fonctionnent pas sur NixOS, par exemple.

Si vous utilisez env comme démontré ci-dessus, vous ne pouvez pas fournir un argument tel que -e à bash (d'après ce que je sais). Mais vous pouvez faire ceci à la place :

#!/usr/bin/env bash
set -e

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X