Pegue sua palavra " todo comando depende de todo comando anterior. Se algum comando falhar, todo o script falhará " literalmente, acho que você não precisa de nenhuma função especial para tratar os erros.
Tudo que você precisa é encadear seus comandos com &&
operador e ||
operador, o que faz exatamente o que você escreveu.
Por exemplo, essa cadeia será interrompida e imprimirá "algo deu errado" se algum dos comandos anteriores for interrompido (o bash lê da esquerda para a direita)
cd foo && rm a && cd bar && rm b || echo "something went wrong"
Exemplo real (eu criei dir foo, arquivo a, barra de dir e arquivo b apenas para uma demonstração real):
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 finalmente, se todos os comandos foram executados com sucesso (código de saída 0), o 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.
O que é importante lembrar é que, com o uso do && next, o comando é executado se o comando anterior sair com o código 0, que para bash significa sucesso.
Se algum comando der errado na cadeia, o comando / script / o que se segue || será executado.
E apenas para o registro, se você precisar executar ações diferentes, dependendo do comando que quebrou, também poderá fazê-lo com script clássico, monitorando o valor $?
que informa o código de saída do comando exatamente anterior (retorna zero se o comando foi executado com êxito ou outro número positivo se o comando falhar)
Exemplo:
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
Resultado:
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
Dica: Você pode suprimir a mensagem "bash: cd: bbar: esse arquivo não existe ..." aplicando eval $comm 2>/dev/null