Yürütme (exit 1);, bir ERRtuzağı tetiklemenin en basit yoludur . Aynı zamanda set -eetkili olması durumunda acil çıkışı tetikleyecektir . (Hata durumunun tetiklenmesi başarısız bir komut gerektirir; exitalt kabuktaki başarısızlık değeri alt kabukların başarısız olmasına neden olur.)
exit 1; bunların hiçbirini yapmayacak.
Bu nedenle {(exit 1); exit 1;}, önce ERRtuzağı üretmek, hata ayıklama amaçları için yararlı bir şeyler yapabilmek ve ardından betiği bir hata bildirimi ile sonlandırmak için kullanılabilir.
Ama dosyalarda olan bu değil autoconf. autoconfkomut EXITdosyaları çalıştırma sırasında oluşturulan geçici dosyaları temizlemek için tuzağa güveniyor . Dahil olmak üzere çoğu kabuk, tuzağı aramadan önce bashdurumu exitkomutta verilen değerden ayarlayacaktır EXIT. Bu, EXITtuzağın bir hatadan mı yoksa normal sonlandırmadan mı başlatıldığını tespit etmesine izin verebilir ve aynı zamanda tuzak işleminin sonunda çıkış durumunun doğru bir şekilde ayarlandığından emin olmasını sağlar.
Bununla birlikte, görünüşe göre, bazı mermiler işbirliği yapmamaktadır. İşte autoconfkılavuzdan bir alıntı :
Bazıları tarafından oluşturulanlar gibi bazı kabuk komut dosyalarından autoconfçıkmadan önce temizlemek için bir tuzak kullanın. Son kabuk komutu sıfır olmayan durumdan çıktıysa, tuzak sıfır olmayan durumdan çıkar ve böylece çağrıcı bir hata oluştuğunu söyleyebilir.
Ne yazık ki, Solaris gibi bazı mermilerde, /bin/shbir çıkış tuzağı, çıkış komutunun argümanını yok sayar. Bu kabuklarda, bir tuzak düz çıkışla mı yoksa çıkış 1 ile mi başlatıldığını belirleyemez. Doğrudan çıkış çağırmak yerine, AC_MSG_ERRORbu sorun için geçici bir çözümü olan makroyu kullanın .
Geçici çözüm olduğundan emin olmak için bir $?çıkış durumu vardır önceexit zaman kesinlikle bu değere sahip olacak, böylece, komut yürütülür EXITtuzak yürütülür. Ve, aslında, bu AC_MSG_ERRORgereksiz kodu ekleyen, gereksiz parantezler ile tamamlanmış olan makrodur.
falseyerine yürütmek değil(exit 1)?