Eksekusi (exit 1);adalah cara paling sederhana untuk memicu ERRjebakan. Ini juga akan memicu keluar segera jika set -esedang berlaku. (Memicu kondisi kesalahan memerlukan perintah untuk gagal; exitdengan nilai kegagalan dalam subkulit menyebabkan subkulit gagal.)
exit 1; tidak akan melakukan hal-hal itu.
Jadi {(exit 1); exit 1;}dapat digunakan untuk pertama-tama menghasilkan ERRjebakan, yang mungkin melakukan sesuatu yang berguna untuk tujuan debugging, dan kemudian mengakhiri skrip dengan indikasi kesalahan.
Tapi bukan itu yang terjadi dalam autoconffile. autoconfskrip mengandalkan EXITjebakan untuk membersihkan file sementara yang dibuat selama proses. Kebanyakan shell, termasuk bashakan mengatur status dari nilai yang disediakan dalam exitperintah sebelum memanggil EXITjebakan. Itu dapat memungkinkan EXITperangkap untuk mendeteksi apakah itu dipanggil dari kesalahan atau dari penghentian normal, dan itu juga memungkinkan untuk memastikan bahwa status keluar diatur dengan benar di akhir operasi perangkap.
Namun, tampaknya beberapa cangkang tidak bekerja sama. Berikut ini kutipan dari autoconfmanual :
Beberapa skrip shell, seperti yang dihasilkan oleh autoconf, menggunakan perangkap untuk membersihkan sebelum keluar. Jika perintah shell terakhir keluar dengan status bukan nol, jebakan juga keluar dengan status bukan nol sehingga penyerang dapat mengetahui bahwa terjadi kesalahan.
Sayangnya, dalam beberapa shell, seperti Solaris /bin/sh, trap keluar mengabaikan argumen perintah keluar. Dalam shell ini, jebakan tidak dapat menentukan apakah itu dipanggil dengan keluar biasa atau dengan keluar 1. Alih-alih memanggil keluar secara langsung, gunakan AC_MSG_ERRORmakro yang memiliki solusi untuk masalah ini.
Solusi adalah untuk memastikan bahwa $?memiliki status exit sebelum itu exitperintah dijalankan, sehingga pasti akan memiliki nilai bahwa ketika EXITperangkap dijalankan. Dan, memang, itu adalah AC_MSG_ERRORmakro yang menyisipkan kode aneh itu, lengkap dengan kawat gigi redundan.
falsesaja(exit 1)?