Dari help set
:
-e Exit immediately if a command exits with a non-zero status.
Tapi itu dianggap praktek buruk oleh beberapa (bash FAQ dan irc freenode #bash FAQ penulis). Direkomendasikan untuk menggunakan:
trap 'do_something' ERR
untuk menjalankan do_something
berfungsi saat terjadi kesalahan.
Lihat http://mywiki.wooledge.org/BashFAQ/105
set -e
menghentikan eksekusi skrip jika perintah atau pipa memiliki kesalahan - yang merupakan kebalikan dari perilaku shell default, yaitu mengabaikan kesalahan dalam skrip. Ketik help set
di terminal untuk melihat dokumentasi untuk perintah bawaan ini.
Sesuai bash - Manual Set Builtin, jika -e
/errexit
disetel, shell akan segera keluar jika pipeline yang terdiri dari satu perintah sederhana, daftar, atau perintah gabungan mengembalikan status bukan nol.
Secara default, status keluar dari pipeline adalah status keluar dari perintah terakhir dalam pipeline, kecuali pipefail
opsi diaktifkan (dinonaktifkan secara default).
Jika demikian, pipeline mengembalikan status perintah terakhir (paling kanan) untuk keluar dengan status bukan nol, atau nol jika semua perintah berhasil keluar.
Jika Anda ingin mengeksekusi sesuatu saat keluar, coba tentukan trap
, misalnya:
trap onexit EXIT
di mana onexit
adalah fungsi Anda untuk melakukan sesuatu saat keluar, seperti di bawah ini yang mencetak jejak tumpukan sederhana:
onexit(){ while caller $((n++)); do :; done; }
Ada opsi serupa -E
/errtrace
yang malah menjebak ERR, mis.:
trap onerr ERR
Contoh
Contoh status nol:
$ true; echo $?
0
Contoh status bukan nol:
$ false; echo $?
1
Meniadakan contoh status:
$ ! false; echo $?
0
$ false || true; echo $?
0
Uji dengan pipefail
dinonaktifkan:
$ bash -c 'set +o pipefail -e; true | true | true; echo success'; echo $?
success
0
$ bash -c 'set +o pipefail -e; false | false | true; echo success'; echo $?
success
0
$ bash -c 'set +o pipefail -e; true | true | false; echo success'; echo $?
1
Uji dengan pipefail
sedang diaktifkan:
$ bash -c 'set -o pipefail -e; true | false | true; echo success'; echo $?
1
Saya menemukan posting ini ketika mencoba mencari tahu apa status keluar untuk skrip yang dibatalkan karena set -e
. Jawabannya tidak tampak jelas bagi saya; maka jawaban ini. Pada dasarnya, set -e
membatalkan eksekusi perintah (misalnya skrip shell) dan mengembalikan kode status keluar dari perintah yang gagal (yaitu skrip dalam, bukan skrip luar) .
Misalnya, saya memiliki skrip shell outer-test.sh
:
#!/bin/sh
set -e
./inner-test.sh
exit 62;
Kode untuk inner-test.sh
adalah:
#!/bin/sh
exit 26;
Ketika saya menjalankan outer-script.sh
dari baris perintah, skrip luar saya diakhiri dengan kode keluar dari skrip dalam:
$ ./outer-test.sh
$ echo $?
26