Tek UNIX belirtiminde , anlamınıset -e
tanımlamak için kullanılan tam dil :
Bu seçenek açık olduğunda , Kabuk Hatalarının Sonuçlarında listelenen sebeplerden herhangi biri için basit bir komut başarısız olursa veya bir çıkış durumu değeri> 0 döndürürse ve [koşullu ya da olumsuzlanan bir komut] değilse, kabuk derhal çıkar.
Bir kabukta böyle bir komut oluştuğunda ne olacağı konusunda bir belirsizlik vardır . Pratik bir bakış açısıyla, tüm alt kabukların çıkarması, çıkış yapmak ve sıfır olmayan bir durumu ana kabuğa döndürmektir. Üst kabuğun çıkıp çıkmayacağı, bu sıfır olmayan durumun ana kabukta başarısız olan basit bir komuta çevrilip çevrilmemesine bağlıdır.
Böyle bir sorunlu durum, karşılaştığınız durumdur: bir komut değişikliğinden sıfır olmayan dönüş durumu . Bu durum göz ardı edildiğinden, ana kabuğun çıkmasına neden olmaz. Daha önce keşfetmiş olduğunuz gibi , çıkış durumunu hesaba katmanın bir yolu, komut yerine kullanılan seçeneği basit bir atamada kullanmaktır : ödevin çıkış durumu, ödev (ler) deki son komut yerine koymanın çıkış durumudur .
Bunun, yalnızca son bir değişimin durumu hesaba katıldığı için yalnızca tek bir komut değişikliğinde olması gerektiği gibi gerçekleştirileceğini unutmayın. Örneğin, aşağıdaki komut başarılıdır (hem standarda göre hem de gördüğüm her uygulamada):
a=$(false)$(echo foo)
İzlemek için başka durum açıkça altkabuklarda : (somecommand)
. Yukarıdaki yoruma göre, alt kabuk sıfır olmayan bir durum döndürebilir, ancak bu ana kabuktaki basit bir komut olmadığından ana kabuk devam etmelidir. Aslında, tanıdığım tüm mermiler ebeveynleri bu noktada geri döndürüyor. Bu, (cd /some/dir && somecommand)
parantezlerin geçerli bir dizin değişikliği gibi bir işlemi tutmak için kullanıldığı yerlerde birçok durumda yararlı olsa set -e
da, alt kabukta kapatılmışsa veya alt kabuk sıfırdan farklı bir durumda döndürürse belirtimi ihlal eder . !
gerçek bir komutla kullanmak gibi onu sonlandırmaz . Örneğin, tüm kül, bash, pdksh, ksh93 ve zsh foo
, aşağıdaki örneklerde gösterilmeden çıkar:
set -e; (set +e; false); echo "This should be displayed"
set -e; (! true); echo "This should be displayed"
Ancak set -e
, yürürlükte iken hiçbir basit komut başarısız olmadı !
Üçüncü bir sorunlu durum, önemsiz bir boru hattındaki unsurlardır . Uygulamada, tüm kabuklar, boru hattı elemanlarının sonuncusu dışındaki başarısızlıklarını görmezden gelir ve son boru hattı elemanına ilişkin iki davranıştan birini sergiler:
- Boru hattının son elemanını üst kabukta yürüten ATT ksh ve zsh, her zamanki gibi iş yapar: eğer boru hattının son elemanında basit bir komut başarısız olursa, ana komutu olan bu komutu uygulayan kabuk, çıkışlar.
- Diğer kabuklar, boru hattının son elemanı sıfır olmayan bir durum döndürürse çıkarak davranışı yaklaşık olarak tahmin eder.
Daha önce set -e
olduğu gibi, boru hattının son elemanında bir olumsuzlamayı kapatmak veya kullanmak, kabuğunu sonlandırmayacak şekilde sıfır olmayan bir durum döndürmesine neden olur; ATT ksh ve zsh dışındaki mermiler daha sonra çıkacaktır.
Bash'in pipefail
seçeneği set -e
, elemanlarından herhangi birinin sıfırdan farklı bir durum döndürmesi durumunda bir boru hattının derhal çıkmasına neden olur .
Başka bir komplikasyon olarak, set -e
POSIX modunda olmadığı sürece ( set -o posix
veya POSIXLY_CORRECT
bash başladığında çevrede olan) bash'in alt kabuklarda kapandığını unutmayın .
Bütün bunlar POSIX şartnamesinin ne yazık ki -e
seçeneği belirlemek konusunda kötü bir iş çıkardığını göstermektedir . Neyse ki, mevcut kabuklar davranışlarında çoğunlukla tutarlıdır.