Gestion des erreurs, set -e et/ou trap

Décidément, teampass ne vas pas avancer si je continue à me disperser…

MAIS ! J’ai trouvé la solution qui réconcilie set -e et trap.
Et qui permet aussi d’utiliser set -u, qui est un vilain set qui outrepasse trap à tout les coups!

Donc effectivement, l’usage de set -E permet de passer par trap et ne pas sortir tout de suite, par contre, set -u, lui passe tout droit!

Petit rappel: set -u permet d’arrêter le script en cas d’usage d’une variable non initialisée. Ce qui évite de faire n’importe quoi.

La solution est donc de déplacer le champs d’action de trap, on ne lui demande plus de saisir les codes de sorties en erreur, mais de saisir la sortie du shell. On laisse ainsi à set -eu le boulot de surveiller les sorties de commandes, et si set décide de quitter le script, trap entre en action.
Bien évidemment, cela à une conséquence facheuse (trop facile sinon), c’est que lorsque le script atteint son terme normalement, il quitte le shell… Donc il déclenche trap…
Trap doit donc prendre en compte le code de sortie de la dernière commande du shell.

Tout ça revient simplement à ces quelques modifications:

trap EXIT_PROPERLY ERR

est remplacé par

trap EXIT_PROPERLY EXIT

Et au début de EXIT_PROPERLY on ajoute ces quelques lignes:

        exit_code=$?
        if [ "$exit_code" -eq 0 ]; then
                exit 0
        fi
        trap '' EXIT
        set +eu

Pour quitter simplement si tout va bien, ou enchaîner avec le trap habituel si il y a une erreur.

Reste plus qu’à espérer qu’il quittera le shell avec un sous-process en arrière plan. Et là, c’est pas sûr…
EDIT: Ça fonctionne très bien, le shell est quitté et le processus en arrière plan est terminé.
Et set -eu peux être intégré à la fonction TRAP_ON pour simplifier l’appel.