Você pode ter uma série de comandos que continuam a ser executados até "falha" usando "& &" para executar os comandos em sucessão; cada comando retorna "true", fazendo com que o seguinte comando seja executado. Então use "||" para executar um comando após falha, como:
#!/bin/bash
cp foo bar \
&& mv bar bar{,.bak} \
&& echo "good so far" \
&& ls file123 | tee -a /tmp/msg.txt \
&& mailx -u user -s "success" -f /tmp/msg.txt \
|| mailx -u user -s "failure" -f ~/err.txt
Como isso pode ficar confuso, use funções, como
#!/bin/bash
do_work() {
mv... || return 1
cp... || return 1
return 0
}
report() {
[ "$1" = "ok" ] && mailx ....
[ "$1" != "ok" ] && mailx -s "$1" ....
return 0
}
do_work \
&& report ok
|| report err
Além disso, seguindo o exemplo acima, você pode adicionar regras gerais por meio de um 'trap' no script que sempre executará certos comandos se qualquer tipo de status de erro for retornado em qualquer ponto do script (incluindo o recebimento de um controle). c (interromper) sinal enquanto o script está sendo executado):
#!/bin/bash
tmp=/tmp/msg.$$.txt
# Cleanup: delete tmp files on exit. On any error, trap and exit... then cleanup
trap 'echo "cleaning up tmpfiles..." && rm $tmp >/dev/null 2>&1' 0
trap "exit 2" 1 2 3 15
...
do_work && exit 0
(Aviso de isenção de responsabilidade ... os comandos mostrados acima são pseudo-códigos gerais, e são apenas digitados da memória sem executá-los. Os Typos certamente existem.)