Bash Shebang pour les nuls?

36

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?

coneybeare
la source
Ces options sont spécifiques à Bash (ou à un autre interprète). Ils peuvent être les mêmes pour d'autres shells (dash et ksh, par exemple), mais ils seraient différents pour d'autres interprètes tels que AWK et Python. Vous pouvez utiliser plusieurs des options acceptées par l'interprète. Les options sont spécifiques à l’interprète, tandis que shebang est une fonctionnalité du noyau.
pause jusqu'à nouvel ordre.

Réponses:

41

Si un script /path/to/foocommence par #!/bin/bash, alors exécuter /path/to/foo arg1 arg2est é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 -xconduirait à ce que bash reçoive un seul argument de cinq caractères -e -x(une erreur de syntaxe) plutôt que deux arguments -eet -x.

Pour le shell Bourne shet 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.

Gilles, arrête de faire le mal
la source
24

Ce sont des options passées pour bashvoir help setplus d’informations, dans ce cas:

-x  Print commands and their arguments as they are executed.
-e  Exit immediately if a command exits with a non-zero status.
cYrus
la source
3
+1 Et -exfait les deux
Nifle
C'est déroutant car elles ressemblent à des options de ligne de commande passées à Bash.
Caoilte
2
@Caoilte: Et en effet , ils sont (de man 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: [...].
cYrus
1
arrgh! cligne des yeux et ça te manque! :)
Caoilte
0

Je voudrais juste mentionner une alternative encore meilleure - comme dans plus portable -:

#!/usr/bin/env bash

L'exemple ci-dessus utilise envpour trouver l' bashexécutable, ce qui n'est pas toujours le cas /bin/bash. Les vieux #!/bin/bashscripts ne fonctionnent pas sur NixOS , par exemple.

Si vous utilisez envcomme 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:

#!/usr/bin/env bash
set -e
Simon Alling
la source
2
Je le fais tout le temps, mais je ne dirais pas que c'est «plus portable» - en fait, le risque de voir l'utilisateur exécuter quelque chose de complètement différent (de ce que l'on peut supposer avec un système livré avec) est beaucoup plus grand. Par exemple, Ubuntu livre toujours Bash 4, alors qu'un utilisateur peut choisir d’exécuter Bash 5.
slhck le
Oui, l' envutilisation n'est pas bonne, en particulier pour les scripts qui exécutent python, car vous ne savez tout simplement pas si la pythonversion 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é
smac89