Jadi saya punya skrip kecil untuk menjalankan beberapa tes.
javac *.java && java -ea Test
rm -f *.class
Sekarang masalah dengan ini adalah ketika saya menjalankan skrip ./test
, itu akan mengembalikan kode keluar yang sukses bahkan jika tes gagal karena rm -f *.class
berhasil.
Satu-satunya cara saya bisa memikirkan untuk melakukan apa yang saya inginkan terasa jelek bagi saya:
javac *.java && java -ea Test
test_exit_code=$?
rm -f *.class
if [ "$test_exit_code" != 0 ] ; then false; fi
Tapi ini sepertinya masalah umum - lakukan tugas, bersihkan, lalu kembalikan kode keluar dari tugas semula.
Apa cara paling idiomatis untuk melakukan ini (dalam bash atau hanya shell pada umumnya)?
bash
shell
exit-status
math4tots
sumber
sumber
eval
selalu menjadi favorit penggemar.Saya akan pergi dengan:
Mengapa melompat-lompat ketika
exit
tersedia?Anda bisa menggunakan
trap
:Sebagai contoh:
sumber
exit ${last_error_code:=0}
.Sejauh yang saya tahu hal terdekat bash harus
try...finally
blok dari bahasa pemrograman yang lebih seperti C (yang mungkin Anda inginkan jika tersedia) adalahtrap
konstruksi, yang bekerja seperti ini:Ini akan menjalankan "rm -f * .class" saat skrip Anda keluar. Jika Anda memiliki sesuatu yang lebih rumit untuk dilakukan, Anda dapat menjalankannya:
Jika Anda cenderung, Anda dapat mengubah ini menjadi idiom yang cukup umum yang bekerja kira-kira seperti
try...catch...finally
blok dalam C. Sesuatu seperti ini:Perhatikan bahwa tanda kurung membatasi subkulit; dengan konstruksi ini, hanya subkulit yang keluar jika perintah gagal, bukan keseluruhan skrip. Ingatlah bahwa subkulit agak mahal secara komputasi jadi jangan gunakan terlalu banyak (ratusan) di antaranya. Bergantung pada skrip Anda, Anda mungkin dapat mencapai efek yang sama lebih efisien dengan fungsi-fungsi shell dan
trap ... RETURN
, tetapi itu tergantung pada Anda untuk menyelidikinya.sumber