Tire sua palavra " cada comando depende de cada comando anterior. Se algum comando falhar, o script inteiro deve falhar " literalmente, acho que você não precisa de nenhuma função especial para tratar os erros. / p>
Tudo o que você precisa é encadear seus comandos com o operador &&
e o operador ||
, que faz exatamente o que você escreveu.
Por exemplo, essa cadeia quebrará e imprimirá "algo deu errado" se qualquer dos comandos anteriores quebrou (o bash lê da esquerda para a direita)
cd foo && rm a && cd bar && rm b || echo "something went wrong"
Exemplo real (criei dir foo, arquivo a, dir bar 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 simplesmente 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 de & & O próximo comando é executado se o comando anterior sair com o código 0, o que para bash significa sucesso.
Se algum comando der errado na cadeia, o comando / script / o que vem depois || será executado.
E apenas para o registro, se você precisar realizar ações diferentes, dependendo do comando que quebrou, você também pode fazê-lo com script clássico, monitorando o valor de $?
, que informa o código de saída do comando exatamente anterior ( retorna zero se o comando for executado com sucesso 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
Saída:
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: Nenhum tal arquivo ..." aplicando eval $comm 2>/dev/null