Preso la tua parola " ogni comando dipende da ogni comando precedente. Se un comando fallisce l'intero script dovrebbe fallire " letteralmente, penso che non hai bisogno di alcuna funzione speciale per trattare gli errori.
Tutto ciò che serve è incatenare i tuoi comandi con &&
operatore e ||
operatore, che fa esattamente quello che hai scritto.
Ad esempio questa catena si spezzerà e stamperà "qualcosa è andato storto" se uno dei comandi precedenti si è rotto (bash legge da sinistra a destra)
cd foo && rm a && cd bar && rm b || echo "something went wrong"
Esempio reale (ho creato dir foo, file a, dir bar e file b solo per una vera demo):
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
E infine se tutti i comandi sono stati eseguiti correttamente (codice di uscita 0), lo script continua:
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.
Ciò che è importante ricordare è che con l'uso di && il comando successivo viene eseguito se il comando precedente è uscito con il codice 0 che per bash significa successo.
Se un comando va storto nella catena, allora il comando / script / qualunque cosa segue || sarà eseguito.
E solo per la cronaca, se devi eseguire diverse azioni a seconda del comando che si è rotto, puoi anche farlo con uno script classico monitorando il valore di $?
cui riporta il codice di uscita del comando esattamente precedente (restituisce zero se il comando è stato eseguito correttamente o altro numero positivo se il comando non è riuscito)
Esempio:
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
Produzione:
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
Suggerimento: è possibile eliminare il messaggio "bash: cd: bbar: nessun file di questo tipo ..." applicando eval $comm 2>/dev/null