Perintah set -e membuat skrip bash gagal segera ketika perintah apa pun mengembalikan kode keluar non-nol.
Apakah ada cara yang mudah dan elegan untuk menonaktifkan perilaku ini untuk perintah individu dalam skrip?
Di tempat mana fungsi ini didokumentasikan dalam Manual Referensi Bash ( http://www.gnu.org/software/bash/manual/bashref.html )?
Alternatif untuk tidak menaati jaminan atas kesalahan adalah dengan memaksakan kesuksesan tidak peduli apa pun. Anda dapat melakukan sesuatu seperti ini:
Itu akan mengembalikan 0 (benar), jadi set -e tidak boleh dipicu
sumber
faulty_cmd || :
adalah ungkapan populer lain untuk ini. (Ini:
adalah perintah yang identik dengantrue
).Jika Anda mencoba menangkap kode pengembalian / kesalahan (fungsi atau garpu), ini berfungsi:
sumber
Jika "keluar segera opsi shell" berlaku atau diabaikan tergantung pada konteks perintah yang dieksekusi (lihat bagian Bash Reference Manual pada Set Builtin - terima kasih kepada Arkadiusz Drabczyk).
Terutama, opsi diabaikan jika perintah adalah bagian dari tes dalam pernyataan if. Oleh karena itu adalah mungkin untuk menjalankan perintah dan memeriksa keberhasilan atau kegagalannya dalam "keluar segera konteks" menggunakan pernyataan if seperti ini:
Dimungkinkan untuk menghilangkan pernyataan "lalu" dan menggunakan lebih sedikit baris:
sumber
Pendekatan lain, yang menurut saya cukup mudah (dan berlaku untuk
set
opsi lain selain-e
):Manfaatkan
$-
untuk mengembalikan pengaturan.Sebagai contoh:
Meskipun untuk
-e
secara khusus, opsi yang disebutkan orang lain (|| true
atau "dimasukkan ke dalamif
") mungkin lebih idiomatis.sumber
Saya sebenarnya memiliki pertanyaan yang sama baru-baru ini (meskipun saya tidak memposting, saya sempat melakukannya), dan, dari apa yang saya lihat, sepertinya hanya menggunakan set + e sebelum perintah dan set -e sesudahnya bekerja paling elegan. Ini sebuah contoh, mengambil respon dari perintah dan tidak membiarkan kesalahan membuangnya.
Ini mengambil output 'keberuntungan', memeriksa status keluarnya, dan menggemakan dan mengatakannya. Saya pikir ini yang Anda minta, atau setidaknya sesuatu yang serupa? Bagaimanapun, semoga ini membantu.
sumber
Saya suka memulai subshell jika ingin mengubah sesuatu sementara. Perintah di bawah ini menunjukkan bahwa bad_command pertama diabaikan dan kedua membatalkan eksekusi.
sumber