J'ai quelques scripts bash que j'ai configurés et qui utilisent principalement
#!/bin/bash
mais je rencontre régulièrement certains qui ressemblent
#!/bin/bash -e
#!/bin/bash -x
#!/bin/bash -ex
etc.
Quelqu'un peut-il expliquer la signification et les avantages de ces options de shebang et s’ils s’appliquent à d’autres shebangs?
Réponses:
Si un script
/path/to/foo
commence par#!/bin/bash
, alors exécuter/path/to/foo arg1 arg2
est équivalent à exécuter/bin/bash /path/too/foo arg1 arg2
. Si la ligne shebang est#!/bin/bash -ex
, cela équivaut à exécuter/bin/bash -ex /path/too/foo arg1 arg2
. Cette fonctionnalité est gérée par le noyau.Notez que vous ne pouvez avoir qu'un seul argument sur la ligne shebang: certains unices (tels que Linux) n'acceptent qu'un argument, ce qui
#!/bin/bash -e -x
conduirait à ce que bash reçoive un seul argument de cinq caractères-e -x
(une erreur de syntaxe) plutôt que deux arguments-e
et-x
.Pour le shell Bourne
sh
et les shell dérivés tels que POSIX sh, bash, ksh et zsh:-e
signifie que si une commande échoue (ce qui est indiqué par un état différent de zéro), le script se termine immédiatement.-x
provoque l’impression par le shell d’une trace d’exécution.D'autres programmes peuvent comprendre ces options mais avec des significations différentes.
la source
Ce sont des options passées pour
bash
voirhelp set
plus d’informations, dans ce cas:la source
-ex
fait les deuxman bash
):In addition to the single-character shell options documented in the description of the set builtin command, bash interprets the following options when it is invoked: [...]
.Je voudrais juste mentionner une alternative encore meilleure - comme dans plus portable -:
L'exemple ci-dessus utilise
env
pour trouver l'bash
exécutable, ce qui n'est pas toujours le cas/bin/bash
. Les vieux#!/bin/bash
scripts 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
(pour autant que je sache). Mais vous pouvez le faire à la place:la source
env
utilisation n'est pas bonne, en particulier pour les scripts qui exécutent python, car vous ne savez tout simplement pas si lapython
version par défaut est la version 2 ou 3, ce qui fait toute la différence pour les scripts nécessitant une version spécifique. Mieux vaut être explicite que rusé