Yürütme (exit 1);
, bir ERR
tuzağı tetiklemenin en basit yoludur . Aynı zamanda set -e
etkili olması durumunda acil çıkışı tetikleyecektir . (Hata durumunun tetiklenmesi başarısız bir komut gerektirir; exit
alt 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 ERR
tuzağı ü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
. autoconf
komut EXIT
dosyaları ç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 bash
durumu exit
komutta verilen değerden ayarlayacaktır EXIT
. Bu, EXIT
tuzağı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 autoconf
kı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/sh
bir çı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_ERROR
bu 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 EXIT
tuzak yürütülür. Ve, aslında, bu AC_MSG_ERROR
gereksiz kodu ekleyen, gereksiz parantezler ile tamamlanmış olan makrodur.
false
yerine yürütmek değil(exit 1)
?