Saya sedang membangun Shell Script yang memiliki if
fungsi seperti ini:
if jarsigner -verbose -keystore $keyst -keystore $pass $jar_file $kalias
then
echo $jar_file signed sucessfully
else
echo ERROR: Failed to sign $jar_file. Please recheck the variables
fi
...
Saya ingin eksekusi skrip selesai setelah menampilkan pesan kesalahan. Bagaimana saya bisa melakukan ini?
Jika Anda memasukkan
set -e
skrip, skrip akan berhenti segera setelah perintah di dalamnya gagal (yaitu segera setelah perintah mengembalikan status bukan nol). Ini tidak memungkinkan Anda menulis pesan Anda sendiri, tetapi seringkali pesan perintah yang gagal itu sendiri sudah cukup.Keuntungan dari pendekatan ini adalah sifatnya otomatis: Anda tidak mengambil risiko lupa menangani kasus kesalahan.
Perintah yang statusnya diuji dengan kondisional (seperti
if
,&&
atau||
) tidak menghentikan skrip (jika tidak, kondisional tidak ada gunanya). Sebuah idiom untuk perintah sesekali yang kegagalannya tidak pentingcommand-that-may-fail || true
. Anda juga dapatset -e
mematikan sebagian skrip denganset +e
.sumber
-x
flag dengan-e
flag sudah cukup untuk melacak di mana program Anda saat keluar. Itu menyiratkan bahwa pengguna skrip juga merupakan pengembang.Jika Anda ingin menangani kesalahan alih-alih keluar secara membabi buta, alih-alih menggunakan
set -e
, gunakan atrap
padaERR
sinyal pseudo.#!/bin/bash f () { errorCode=$? # save the exit code as the first thing done in the trap function echo "error $errorCode" echo "the command executing at the time of the error was" echo "$BASH_COMMAND" echo "on line ${BASH_LINENO[0]}" # do some error handling, cleanup, logging, notification # $BASH_COMMAND contains the command that was being executed at the time of the trap # ${BASH_LINENO[0]} contains the line number in the script of that command # exit the script or return to try again, etc. exit $errorCode # or use some other value or do return instead } trap f ERR # do some stuff false # returns 1 so it triggers the trap # maybe do some other stuff
Perangkap lain dapat diatur untuk menangani sinyal lain, termasuk sinyal Unix biasa ditambah sinyal pseudo Bash lainnya
RETURN
danDEBUG
.sumber
Inilah cara melakukannya:
#!/bin/sh abort() { echo >&2 ' *************** *** ABORTED *** *************** ' echo "An error occurred. Exiting..." >&2 exit 1 } trap 'abort' 0 set -e # Add your script below.... # If an error occurs, the abort() function will be called. #---------------------------------------------------------- # ===> Your script goes here # Done! trap : 0 echo >&2 ' ************ *** DONE *** ************ '
sumber
exit 1
adalah semua yang Anda butuhkan. Ini1
adalah kode pengembalian, sehingga Anda dapat mengubahnya jika Anda ingin, katakanlah,1
berarti proses yang sukses dan-1
berarti kegagalan atau semacamnya.sumber
test
atau&&
atau||
.