Innanzitutto, temo questa spiegazione -o
dell'opzione da http://explainshell.com non sia del tutto corretta.
Dato che set
è un comando bulit-in, possiamo vedere la sua documentazione conhelp
eseguendo 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
Come potete vedere -o pipefail
significa:
il valore restituito di una pipeline è lo stato dell'ultimo comando da uscire con uno stato diverso da zero o zero se nessun comando è uscito con uno stato diverso da zero
Ma non dice: Write the current settings of the options to standard output in an unspecified format.
Ora, -x
viene utilizzato per il debug come già lo conosci e -e
interromperà l'esecuzione dopo il primo errore nello script. Considera uno script come questo:
#!/usr/bin/env bash
set -euxo pipefail
echo hi
non-existent-command
echo bye
La echo bye
riga non verrà mai eseguita quando -e
viene utilizzata perché
non-existent-command
non restituisce 0:
+ echo hi
hi
+ non-existent-command
./setx.sh: line 5: non-existent-command: command not found
Senza -e
l'ultima riga verrebbe stampata perché anche se si è verificato un errore non abbiamo detto Bash
di uscire automaticamente:
+ echo hi
hi
+ non-existent-command
./setx.sh: line 5: non-existent-command: command not found
+ echo bye
bye
set -e
viene spesso collocato nella parte superiore dello script per assicurarsi che lo script venga arrestato quando si verifica il primo errore, ad esempio se il download di un file non riesce non ha senso estrarlo.
set -uxo pipefail
).