2013-11-10 16 views
6

İşte basit bir soru. Bu şekilde davranmaz neden Ben öyle olacağına düşünüyorum:`exit 'parantez içinde</ a0> içinde komut dosyası çıkmıyor

(echo "Test 1"; exit) && echo "Test 2" 

... ya da ...

VAR1=1 
VAR2=2 
[ $VAR1 == $VAR2 ] || (echo '$VAR1 does not equal $VAR2, exiting.'; exit) 
echo -e 'Well, I\'m still alive yo!' 

bu iki snippet'lerinin ya Koşu açık exit komutu rağmen devam komut dosyası yürütülmesine neden olur .

Açıkçası, parantezleri bir nedenden dolayı etkiliyorlar, sorum şu: Neden?

cevap

7

Parantezler, içeriklerini bir alt kabukta yürütür, bu nedenle çıkacak alt kabukdur.

Genellikle, aynı etkiyi başka bir && ile veya () yerine {} kullanarak elde edersiniz. (...) ait

{ echo "Test 1"; exit; } && echo "Test 2" 

Ya

echo "Test 1" && exit && echo "Test 2" 
+0

Yukarıda sözü edilen 'subshell' kullanılmadan nasıl yapılır? – jduncanator

+0

Kevin tarafından verilen bu iki örnekle, alt kabukları kullanmayacaksınız;) –

1

içeriği size bu yüzden sadece exit bu kabuk, bir kabuktaki yürütülür. Bu yaklaşım sizin için daha iyi çalışması gerektiğini ve bir sonraki kişi gelip Senaryonu açmak için bir muhafaza okumak daha kolaydır:

VAR1=1 
VAR2=2 
if [ $VAR1 == $VAR2 ] ; then 
    echo -e "Well, I'm still alive yo!" 
else 
    echo "$VAR1 does not equal $VAR2, exiting." 
    exit 
fi 
1

Sadece parantez içinde kaldırmak ve onu istediğini yapmalıdır.

Parantez, içeriklerini başka bir kabuk komut dosyasına koymakla eşdeğerdir; burada exit yalnızca kabuk komut dosyasından çıkar. http://tldp.org/LDP/abs/html/subshells.html

parantez arasına gömülmüş bir komut listesinden

0

bir kabuktaki olarak çalışır.

Kıvrımlı parantezler arasında bir kod bloğu bir alt kabuk başlatmaz.

{ command1; command2; command3; . . . commandN; } 

İlk durumda çıkış sona erer ve döner çağıran kabuk kontrol alt kabuk tarafından yönetilmektedir.

İlgili konular