Então, eu tenho um pequeno script para executar alguns testes.
javac *.java && java -ea Test
rm -f *.class
Agora, o problema é que, quando eu executo o script ./test
, ele retornará um código de saída com êxito, mesmo que o teste falhe porque rm -f *.class
é bem-sucedido.
A única maneira de pensar em fazê-lo fazer o que quero me parece feia:
javac *.java && java -ea Test
test_exit_code=$?
rm -f *.class
if [ "$test_exit_code" != 0 ] ; then false; fi
Mas isso parece um problema comum - execute uma tarefa, limpe e retorne o código de saída da tarefa original.
Qual é a maneira mais idiomática de fazer isso (no bash ou apenas conchas em geral)?
bash
shell
exit-status
math4tots
fonte
fonte
eval
é sempre um favorito dos fãs.Eu iria com:
Por que pular quando
exit
está disponível?Você pode usar um
trap
:Por exemplo:
fonte
exit ${last_error_code:=0}
.Até onde eu sei, o bash mais próximo de um
try...finally
bloco de uma linguagem de programação mais parecida com o C (que é o que você provavelmente desejaria se estivesse disponível) é atrap
construção, que funciona assim:Isso executará "rm -f * .class" quando o script sair. Se você tiver algo mais complexo para fazer, poderá colocá-lo em uma função:
Se você é tão inclinado, pode transformar isso em um idioma bastante geral que funciona aproximadamente como um
try...catch...finally
bloco em C. Algo assim:Observe que os parênteses delimitam um subshell; com essa construção, somente o subshell sai se um comando falhar, não o script inteiro. Lembre-se de que os subconjuntos são um pouco computacionais, portanto, não use muitos (centenas) deles. Dependendo do seu script, você poderá obter o mesmo efeito com mais eficiência com as funções de shell e
trap ... RETURN
, mas isso depende de você investigar.fonte