Une façon courante est:
die() {
IFS=' ' # make sure "$*" is joined with spaces
# output the arguments if any on stderr:
[ "$#" -eq 0 ] || printf '%s\n' "$*" 1>&2
exit 1
}
alors vous l'utilisez comme ceci:
mkdir -p some/path || die "mkdir failed with status $?"
Ou si vous voulez qu'il inclue le statut de sortie, vous pouvez le changer en:
die() {
last_exit_status=$?
IFS=' '
printf '%s\n' "FATAL ERROR: $* (status $last_exit_status)" 1>&2
exit 1
}
puis l'utiliser est un peu plus simple:
mkdir -p some/path || die "mkdir failed"
En cas d'échec, vous mkdir
aurez probablement déjà émis un message d'erreur, de sorte que le second peut être considéré comme redondant, et vous pouvez simplement faire:
mkdir -p some/path || exit # with the same (failing) exit status as mkdir's
mkdir -p some/path || exit 1 # with exit status 1 always
(ou utilisez la première variante de die
ci - dessus sans argument)
Juste au cas où vous ne l'auriez pas vu command1 || command2
auparavant, il s'exécute command1
et s'il command1
échoue, il s'exécute command2
.
Vous pouvez donc le lire comme "créer le répertoire ou mourir".
Votre exemple ressemblerait à:
mkdir -p some/path || die "mkdir failed"
cd some/path || die "cd failed"
some_command || die "some_command failed"
Ou vous pouvez aligner le dies
plus à droite pour que le code principal soit plus évident.
mkdir -p some/path || die "mkdir failed"
cd some/path || die "cd failed"
some_command || die "some_command failed"
Ou sur la ligne suivante lorsque les lignes de commande sont longues:
mkdir -p some/path ||
die "mkdir failed"
cd some/path ||
die "cd failed"
some_command ||
die "some_command failed"
De plus, si vous prévoyez d'utiliser le nom some/path
plusieurs fois, stockez-le dans une variable afin de ne pas avoir à le taper et pouvez facilement le modifier si vous en avez besoin. Et lorsque vous passez des arguments variables à des commandes, assurez-vous d'utiliser le --
délimiteur d'options pour que l'argument ne soit pas pris comme option s'il commence par -
.
dir=some/path
mkdir -p -- "$dir" || die "Cannot make $dir"
cd -P -- "$dir" || die "Cannot cd to $dir"
some_command || die "Cannot run some_command"
return $?
par la fonction:
intégrée.Si vous voulez vraiment
exit
une erreur et utilisez Bash, alors vous devriez également considérerset -e
. Dehelp set
:Bien sûr, cela ne vous donne pas la flexibilité d'une fonction did_it_work (), mais c'est un moyen facile de vous assurer que votre script bash s'arrête sur une erreur sans ajouter beaucoup d'appels à votre nouvelle fonction.
la source
set -e
est utile. Certaines commandes renvoient des valeurs non nulles dans des circonstances normales (par exemple,diff
). Lorsque j'utilise set -e dans un script où j'attends un retour différent de zéro, je le faiscommand || true
.set -e
, vous pouvez définir un «gestionnaire d'exceptions» pour détecter toutes les erreurstrap did_it_work EXIT
.command && true
. De cette façon, la valeur de retour n'est pas modifiée.command || true
est d'empêcher laset -e
sortie du script sicommand
renvoie un code de sortie différent de zéro. Il modifie le code de sortie car nous en avons besoin. La seule chose àcommand && true
faire est de s'exécutertrue
(retourner un code de sortie zéro) si la commande `a réussi (a renvoyé un code de sortie zéro) - c'est un no-op complet.