2013-11-10 9 views
6

यहां एक साधारण सवाल है। क्यों इस तरह से व्यवहार नहीं कर रहा है मुझे लगता है कि यह होगा:ब्रांड्स के अंदर 'निकास' स्क्रिप्ट से बाहर नहीं निकलता है

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

... या ...

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

उन दो स्निपेट के दोनों चल रहा स्क्रिप्ट निष्पादन एक स्पष्ट exit आदेश के बावजूद जारी में परिणाम होगा ।

स्पष्ट रूप से ब्रांड्स कुछ कारणों से कमांड को प्रभावित कर रहे हैं, मेरा सवाल है क्यों?

उत्तर

7

कोष्ठक अपनी सामग्री को सबशेल में निष्पादित करते हैं, इसलिए यह उपशीर्षक निकलता है।

आप आमतौर पर && के साथ या () के बजाय {} का उपयोग कर उसी प्रभाव को प्राप्त करेंगे।

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

या

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

उपरोक्त 'सबहेल' का उपयोग किये बिना उपरोक्त कैसे किया जाएगा? – jduncanator

+0

केविन द्वारा दिए गए इन दो उदाहरणों के साथ, आप subshells का उपयोग नहीं करेंगे;) –

1

(...) की सामग्री है, तो आप सिर्फ exit इस खोल एक subshell में क्रियान्वित कर रहे हैं। यह दृष्टिकोण आपके लिए बेहतर काम करना चाहिए और यह आसान है पढ़ने के लिए एक बनाए रखने के लिए अगले व्यक्ति के साथ आते हैं और अपनी स्क्रिप्ट को खोलने के लिए:

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

बस कोष्ठकों को हटा कर उसे आप क्या चाहते हैं क्या करना चाहिए।

ब्रांड्स अपनी सामग्री को अन्य शेल स्क्रिप्ट में रखने के बराबर हैं, जहां exit बस उस शेल स्क्रिप्ट से बाहर निकलता है।

0

से http://tldp.org/LDP/abs/html/subshells.html

एक कमांड सूची कोष्ठकों के बीच एम्बेडेड एक subshell के रूप में चलाता है।

(command1; command2; command3; ...) 

घुंघराले ब्रैकेट के बीच एक कोड ब्लॉक एक सबहेल लॉन्च नहीं करता है।

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

पहले मामले में निकास उप खोल द्वारा चलाया जा रहा है जो आवंटित खोल को नियंत्रित करता है और नियंत्रण देता है।

संबंधित मुद्दे