Até onde sei, o mais próximo que o bash tem de um bloco try...finally
de uma linguagem de programação mais semelhante ao C (que é o que você provavelmente desejaria se estivesse disponível) é a construção trap
, que funciona como isso:
trap "rm -f *.class" EXIT
javac *.java && java -ea Test
Isto irá executar "rm -f * .class" quando o seu script sair. Se você tem algo mais complexo para fazer, você pode colocá-lo em uma função:
cleanup() {
...
}
trap cleanup EXIT
javac *.java && java -ea Test
Se você é tão inclinado, você pode transformar isso em um idioma bastante geral que funciona mais ou menos como um bloco try...catch...finally
em C. Algo parecido com isto:
(
trap "catch_block; exit" ERR
trap finally_block EXIT
# contents of try goes here
)
Note que os parênteses delimitam uma sub-camada; com essa construção, apenas o subshell é encerrado se um comando falhar, não o script inteiro. Lembre-se que os subshells são computacionalmente caros, então não use muitos (centenas) deles. Dependendo do seu script, você pode conseguir o mesmo efeito de forma mais eficiente com as funções do shell e trap ... RETURN
, mas cabe a você investigar.