Tout d'abord, je crains que l'explication de l' -o
option proposée par http://explainshell.com ne soit pas entièrement correcte.
Étant donné qu'il set
s'agit d'une commande intégrée, nous pouvons voir sa documentation help
en exécutant help set
:
-o option-name
Set the variable corresponding to option-name:
allexport same as -a
braceexpand same as -B
emacs use an emacs-style line editing interface
errexit same as -e
errtrace same as -E
functrace same as -T
hashall same as -h
histexpand same as -H
history enable command history
ignoreeof the shell will not exit upon reading EOF
interactive-comments
allow comments to appear in interactive commands
keyword same as -k
monitor same as -m
noclobber same as -C
noexec same as -n
noglob same as -f
nolog currently accepted but ignored
notify same as -b
nounset same as -u
onecmd same as -t
physical same as -P
pipefail the return value of a pipeline is the status of
the last command to exit with a non-zero status,
or zero if no command exited with a non-zero status
posix change the behavior of bash where the default
operation differs from the Posix standard to
match the standard
privileged same as -p
verbose same as -v
vi use a vi-style line editing interface
xtrace same as -x
Comme vous pouvez le voir, cela -o pipefail
signifie:
la valeur de retour d'un pipeline est l'état de la dernière commande à quitter avec un état non nul, ou zéro si aucune commande n'est sortie avec un état non nul
Mais cela ne dit pas: Write the current settings of the options to standard output in an unspecified format.
Maintenant, -x
est utilisé pour le débogage comme vous le savez déjà et -e
arrêtera de s'exécuter après la première erreur du script. Considérez un script comme celui-ci:
#!/usr/bin/env bash
set -euxo pipefail
echo hi
non-existent-command
echo bye
La echo bye
ligne ne sera jamais exécutée lorsqu'elle -e
est utilisée car
non-existent-command
ne renvoie pas 0:
+ echo hi
hi
+ non-existent-command
./setx.sh: line 5: non-existent-command: command not found
Sans -e
la dernière ligne serait imprimée car même si une erreur s'est produite, nous n'avons pas dit Bash
de quitter automatiquement:
+ echo hi
hi
+ non-existent-command
./setx.sh: line 5: non-existent-command: command not found
+ echo bye
bye
set -e
est souvent placé en haut du script pour s'assurer que le script sera arrêté lors de la première erreur - par exemple, si le téléchargement d'un fichier a échoué, il n'est pas logique de l'extraire.
set -uxo pipefail
).