Salah satu cara yang umum adalah:
die() {
IFS=' ' # make sure "$*" is joined with spaces
# output the arguments if any on stderr:
[ "$#" -eq 0 ] || printf '%s\n' "$*" 1>&2
exit 1
}
maka Anda menggunakannya seperti ini:
mkdir -p some/path || die "mkdir failed with status $?"
Atau jika Anda ingin menyertakan status keluar, Anda dapat mengubahnya ke:
die() {
last_exit_status=$?
IFS=' '
printf '%s\n' "FATAL ERROR: $* (status $last_exit_status)" 1>&2
exit 1
}
dan kemudian menggunakannya sedikit lebih mudah:
mkdir -p some/path || die "mkdir failed"
Ketika gagal, mkdir
kemungkinan akan sudah mengeluarkan pesan kesalahan, sehingga yang kedua mungkin dianggap berlebihan, dan Anda bisa melakukannya:
mkdir -p some/path || exit # with the same (failing) exit status as mkdir's
mkdir -p some/path || exit 1 # with exit status 1 always
(atau gunakan varian pertama di die
atas tanpa argumen)
Kalau-kalau Anda belum melihat command1 || command2
sebelumnya, itu berjalan command1
, dan jika command1
gagal, itu berjalan command2
.
Jadi Anda bisa membacanya seperti "membuat direktori atau mati".
Contoh Anda akan terlihat seperti:
mkdir -p some/path || die "mkdir failed"
cd some/path || die "cd failed"
some_command || die "some_command failed"
Atau Anda dapat menyelaraskan dies
lebih jauh di sebelah kanan sehingga kode utama lebih jelas.
mkdir -p some/path || die "mkdir failed"
cd some/path || die "cd failed"
some_command || die "some_command failed"
Atau pada baris berikut saat baris perintah panjang:
mkdir -p some/path ||
die "mkdir failed"
cd some/path ||
die "cd failed"
some_command ||
die "some_command failed"
Juga, jika Anda akan menggunakan nama some/path
beberapa kali, simpan dalam variabel sehingga Anda tidak harus terus mengetiknya, dan dapat dengan mudah mengubahnya jika perlu. Dan ketika meneruskan argumen variabel ke perintah, pastikan untuk menggunakan --
pembatas opsi sehingga argumen tidak diambil sebagai opsi jika dimulai dengan -
.
dir=some/path
mkdir -p -- "$dir" || die "Cannot make $dir"
cd -P -- "$dir" || die "Cannot cd to $dir"
some_command || die "Cannot run some_command"
return $?
dengan:
builtin.Jika Anda benar-benar ingin
exit
melakukan kesalahan dan menggunakan Bash, maka Anda juga harus mempertimbangkanset -e
. Darihelp set
:Ini tentu saja tidak memberi Anda fleksibilitas fungsi did_it_work (), tetapi ini adalah cara mudah untuk memastikan skrip bash Anda berhenti pada kesalahan tanpa menambahkan banyak panggilan ke fungsi baru Anda.
sumber
set -e
berguna. Ada beberapa perintah yang mengembalikan non-nol dalam keadaan normal (misalnya,diff
). Ketika saya menggunakan set -e dalam skrip di mana saya mengharapkan pengembalian bukan nol, saya lakukancommand || true
.set -e
, Anda dapat mengatur "pengendali pengecualian" untuk menangkap semua kesalahantrap did_it_work EXIT
.command && true
. Seperti itu nilai kembali tidak berubah.command || true
adalah untuk mencegahset -e
skrip keluar jikacommand
mengembalikan kode keluar yang tidak nol. Itu mengubah kode keluar karena kita perlu. Satu-satunya halcommand && true
yang dijalankan adalahtrue
(mengembalikan kode keluar nol) jika `perintah berhasil (mengembalikan kode keluar nol) - itu adalah no-op lengkap.