Je souhaite que les erreurs rencontrées lors de l'exécution d'un script sh soient propagées. `set -e` est parfait pour ça, sauf dans certains cas : lorsque les commandes sont dans une condition. Un extrait de man bash:
Code : Tout sélectionner
-e Exit immediately if a pipeline (which may consist of a single simple command), a list, or a compound command (see SHELL
GRAMMAR above), exits with a non-zero status. The shell does not exit if the command that fails is part of the command
list immediately following a while or until keyword, part of the test following the if or elif reserved words, part of
any command executed in a && or || list except the command following the final && or ||, any command in a pipeline but
the last, or if the command's return value is being inverted with !. If a compound command other than a subshell returns
a non-zero status because a command failed while -e was being ignored, the shell does not exit. A trap on ERR, if set,
is executed before the shell exits. This option applies to the shell environment and each subshell environment sepa‐
rately (see COMMAND EXECUTION ENVIRONMENT above), and may cause subshells to exit before executing all the commands in
the subshell.
Et un MVE pour comprendre le souci :
Code : Tout sélectionner
#!/bin/sh
set -e
(
false
echo "passed"
) || echo "failed"
Ce script renvoie "passed", alors qu'on pourrait s'attendre à voir "failed". Comment modifier ce script pour obtenir le comportement attendu ? Ajouter un `set -e` à l'intérieur du sub-shell suit le même comportement :
Code : Tout sélectionner
#!/bin/sh
set -e
(
set -e
false
echo "passed"
) || echo "failed"