`{{(1. çıkış); çıkış 1; }; } `demek?


28

config.statusTarafından oluşturulan bir sonraki kod parçasını alıntı yaptım configure.

if test ! -f "$as_myself"; then
{ { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
{ (exit 1); exit 1; }; }
fi

Kod pasajında ​​ne { (exit 1); exit 1; };işe yarar ? Sadece exitbir deniz kabuğunda yapmanın amacı nedir ?

Yanıtlar:


33

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.


Neden sadece falseyerine yürütmek değil (exit 1)?
Ruslan

3
@Ruslan: İki problem. (1) En önemlisi: falsedurum kodunu ayarlamanıza izin vermez ve hangi sıfır olmayan durumun döneceğine dair hiçbir garanti yoktur. (2) falsegenellikle bir yerleşik değildir, bu yüzden bir çocuk süreci gerektirir; Buna karşılık, kabukların çoğu, bir çocuğun idare etmesi için ortaya çıkmasını önleyebilir (exit 1).
rici

8

Görebildiğim kadarıyla bunun için bir amaç yok, bir alt kabuk başlatarak ve sonra hemen çıkarak doğrudan elde edilebilecek hiçbir şey yok.

Bunun gibi şeyler büyük olasılıkla otomatik olarak kod üreten bir yan etkidir - bazı durumlarda alt kabukta exit 1mantıklı olan yerlerde yürütülen başka komutlar olabilir . Nihayetinde, bazı durumlarda hiçbir işlevi olmayan bazı ifadeleri eklemesine izin vererek ve her seferinde “temiz kod” oluşturmak daha kolay bir şekilde, üretim kodunun basitleştirilmesi iyi bir ihtimal. Ya bu ya da yukarıdakileri oluşturan kod sadece çok kötü yazılmıştır :)

Bunun liberal kullanımı {...}bunun başka bir örneğidir, çoğu gereksizdir, ancak her durumda (belki de bazılarında bloğun çıktısını / girişini yönlendirmek istediğiniz) blokayı ayırmak yerine bunları yazmak kolaydır. ihtiyaç duyulmadıklarını ve ihmal ettiklerini


Bir amacı var. @ Rici'nin cevabına bakınız.
Eski Pro

1

(exit 1)Belli bir çıkış kodu almanın en basit yolu, basit bir olasılıktır (1'in özel durumunda, elbette daha kolay yollar vardır). Ancak bu durumda çıkış kodu incelenmediğinden nedeni bu değildir.

Alt exitkabuk koymanın amacı , komut dosyasından çıkmamak olabilir (belirli bir çıkış kodunun oluşturulması için çıkış kullanıyor olsa da).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.