Pris votre mot " chaque commande dépend de chaque commande précédente. Si une commande échoue, le script entier devrait échouer " littéralement, je pense que vous n'avez besoin d'aucune fonction spéciale pour traiter les erreurs.
Tout ce dont vous avez besoin est de chaîner vos commandes avec &&
opérateur et ||
opérateur, qui fait exactement ce que vous avez écrit.
Par exemple, cette chaîne sera rompue et affichera "quelque chose s'est mal passé" si l' une des commandes précédentes s'est rompue (bash lit de gauche à droite)
cd foo && rm a && cd bar && rm b || echo "something went wrong"
Exemple réel (j'ai créé dir foo, file a, dir bar et file b juste pour une vraie démo):
gv@debian:/home/gv/Desktop/PythonTests$ cd foo && rm a && cd bar && rm bb || echo "something is wrong"
rm: cannot remove 'bb': No such file or directory
something is wrong #mind the error in the last command
gv@debian:/home/gv/Desktop/PythonTests$ cd foo && rm aa && cd bar && rm b || echo "something is wrong"
rm: cannot remove 'aa': No such file or directory
something is wrong #mind the error in second command in the row
Et enfin, si toutes les commandes ont été exécutées avec succès (code de sortie 0), le script continue:
gv@debian:/home/gv/Desktop/PythonTests$ cd foo && rm a && cd bar && rm b || echo "something is wrong"
gv@debian:/home/gv/Desktop/PythonTests/foo/bar$
# mind that the error message is not printed since all commands were successful.
Ce qui est important à retenir, c'est qu'avec l'utilisation de &&, la commande suivante est exécutée si la commande précédente est sortie avec le code 0, ce qui signifie pour bash le succès.
Si une commande échoue dans la chaîne, la commande / script / tout ce qui suit || sera exécuté.
Et pour mémoire, si vous devez effectuer différentes actions en fonction de la commande qui a échoué, vous pouvez également le faire avec un script classique en surveillant la valeur de $?
ce qui rapporte le code de sortie de la commande exactement précédente (renvoie zéro si la commande a été exécutée avec succès ou autre nombre positif si la commande a échoué)
Exemple:
for comm in {"cd foo","rm a","cd bbar","rm b"};do #mind the error in third command
eval $comm
if [[ $? -ne 0 ]];then
echo "something is wrong in command $comm"
break
else
echo "command $comm executed succesful"
fi
done
Production:
command cd foo executed succesfull
command rm a executed succesfull
bash: cd: bbar: No such file or directory
something is wrong in command cd bbar
Astuce: vous pouvez supprimer le message "bash: cd: bbar: No such file ..." en appliquant eval $comm 2>/dev/null