Bagaimana saya bisa menulis skrip shell yang keluar, jika salah satu bagian gagal? Misalnya, jika cuplikan kode berikut gagal, maka skrip harus keluar.
n=0
until [ $n -ge 5 ]
do
gksu *command* && break
n=$[$n+1]
sleep 3
bash
scripting
error-handling
Weylyn
sumber
sumber
set -e
. Itu tidak benar-benar berlaku di sini. OP ingin keluar dari skrip setelah 5 upaya gagal menjalankan perintah.set -e
satu-satunya cara saya tahu untuk melakukan itu.set -e
adalahsleep
(break
menjadi builtin khusus akan menyebabkan skrip keluar pada kegagalan di sebagian besar shell, perintah diif
atau di sebelah kiri&&
tidak terpengaruh olehset -e
,n=...
bisa gagal jikan
hanya baca, tapi kemudian yang akan keluar dari skrip tanpaset -e
juga), sehingga interpretasi terdengar sangat tidak mungkin. Saya setuju pertanyaan itu tidak ditulis dengan baik.Anda dapat keluar dari skrip di mana saja menggunakan kata kunci
exit
. Anda juga dapat menentukan kode keluar untuk menunjukkan kepada program lain bahwa atau bagaimana skrip Anda gagal, misalnyaexit 1
atauexit 2
lain - lain (dengan konvensi, kode keluar 0 untuk kesuksesan dan apa pun yang lebih besar dari 0 menandakan kegagalan; namun, juga dengan konvensi, keluar kode di atas 127 dicadangkan untuk pemutusan yang tidak normal (misalnya dengan sinyal)).Konstruksi generik untuk keluar dari kegagalan adalah
dengan cocok
failure condition
dann
. Tetapi dalam skenario tertentu Anda dapat melanjutkan berbeda. Sekarang untuk kasus Anda, saya menafsirkan pertanyaan Anda bahwa jika salah satu dari lima doagksu
gagal, maka Anda bermaksud untuk keluar. Salah satu caranya adalah dengan menggunakan fungsi seperti inidan kemudian, aktifkan loop oleh
try_command
.Ada (lebih) cara canggih atau canggih untuk menjawab pertanyaan Anda. Namun, solusi di atas lebih mudah diakses oleh pemula daripada, katakanlah, solusi Stephane.
sumber
exit
keluar dari skrip kecuali jika dipanggil dalam subkulit. Jika bagian skrip tersebut berada dalam subkulit, misalnya karena berada di dalam(...)
atau$(...)
atau bagian dari pipa-saluran, maka itu hanya akan keluar dari subkulit itu .Dalam hal itu, jika Anda ingin skrip keluar selain subkulit, maka Anda harus memanggil
exit
keluar subkulit tersebut.Misalnya, di sini dengan 2 tingkat subshell bersarang:
Ini bisa menjadi lebih sulit jika subshell adalah bagian dari pipa.
bash
memiliki khusus$PIPESTATUS
array, mirip denganzsh
's$pipestatus
salah satu yang dapat membantu Anda di sini:sumber
Trap akan melakukan tindakan setelah menerima sinyal.
Jalankan ini dan biarkan keluar secara normal. Itu terperangkap pada sinyal 0.
Jalankan lagi dan interupsi dengan ^ C. Ia terperangkap pada sinyal 2 dan sinyal 0.
Status keluar yang tidak nol akan menjebak ERR
sumber