2013-02-12 13 views
5

मुझे कुछ व्यवहार दिखाई दे रहा है जो मुझे समझ में नहीं आता है जब मैं -e विकल्प के साथ एक बैश स्क्रिप्ट चलाता हूं जिसमें एकाधिक आदेश && एस के साथ मिलकर आते हैं और उनमें से एक विफल हो जाता है। मैं उम्मीद करता हूं कि स्क्रिप्ट विफल आदेश पर रुक जाए और बाहर निकलने की स्थिति लौटाए, लेकिन इसके बजाय यह बाकी स्क्रिप्ट को खुशी से निष्पादित करता है।शॉर्ट सर्किट कमांड के अनुक्रम में असफलताओं के लिए त्रुटि पर बैश क्यों नहीं रोकता है?

$ false && true; echo $? 
1 

$ bash -xe -c "false && true"; echo $? 
+ false 
1 

$ bash -xe -c "false; true"; echo $? 
+ false 
1 

और यहाँ है कि मेरे पास कोई मतलब नहीं है एक:

$ bash -xe -c "false && true; true"; echo $? 
+ false 
+ true 
0 

यह मैं कहाँ समझ में नहीं आता क्या है

यहाँ है कि मेरे पास कोई मतलब उदाहरण हैं चल रहा। false && true रिटर्न स्थिति 1 इसलिए स्क्रिप्ट को निष्पादित करना बंद नहीं करना चाहिए और स्थिति 1 वापस करना चाहिए, जैसे स्क्रिप्ट false; true है?

जबकि प्रयोग, मैंने पाया कि यह जिस तरह से मैं उम्मीद करेंगे काम करता है अगर मैं कोष्ठकों के साथ आदेशों की श्रृंखला के चारों ओर:

$ bash -xe -c "(false && true); true"; echo $? 
+ false 
1 

किसी को भी इस के लिए एक स्पष्टीकरण दे सकते हैं?

उत्तर

7

यहां तर्क यह है कि && का उपयोग पहले से ही त्रुटि-जांच है। उसी तरह bash स्थिति में set -e के साथ भी निरस्त करने के रूप में विफलता का इलाज नहीं करता है।

जब आप कमांड में कमांड को लपेटते हैं, तो आप वास्तव में उन आदेशों को एक सबहेल में चला रहे हैं, इसलिए स्क्रिप्ट स्वयं केवल उस सबहेल की वापसी को देखती है, यानी: यह पता नहीं है कि && बिल्कुल शामिल है, इसलिए जैसा कि आप उम्मीद करते हैं यह बंद हो जाता है।

+0

जो वास्तव में बहुत समझ में आता है। मुझे पता था कि 'अगर' इस तरह से काम करता है लेकिन यह मेरे लिए कभी नहीं हुआ कि बैश 'वही' का इलाज करेगा। – histumness

4
संदर्भ मैनुअल Quoth

:

खोल नहीं करता है बाहर निकलें, तो आदेश है कि विफल रहता आदेश सूची का हिस्सा तुरंत एक अगर बयान, के हिस्से में एक समय या कीवर्ड तक, परीक्षण के हिस्से के निम्नलिखित है & & या किसी भी आदेश में निष्पादित कोई भी आदेश अंतिम & & या || के बाद कमांड को छोड़कर सूची, पाइपलाइन में कोई भी कमांड, लेकिन अंतिम, या यदि कमांड की वापसी स्थिति को उलटा जा रहा है!

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