मैंने एल कैपिटन से पहले एसयूएसई 11.3 और मैक ओएस दोनों पर बैश संस्करण 3.2.51 में यह व्यवहार देखा है। एल कैपिटन पर बैश 3.2.57 में "सही" व्यवहार है, यानी बैश की तरह 4.
हालांकि, उपरोक्त प्रस्तावित कार्यवाही, "बाहर निकलें $?" सबहेल के बंद होने वाले माता-पिता के बाद, झंडे के इरादे को हरा देता है इससे कोई फर्क नहीं पड़ता कि बाश का कौन सा संस्करण है। आदमी पार्टी से:
-e बाहर निकलें तुरंत अगर एक साधारण आदेश (ऊपर देखें शेल व्याकरण) बाहर निकल जाता है एक गैर शून्य की स्थिति के साथ । यदि विफल रहता है तो शेल बाहर नहीं निकलता है कमांड सूची का हिस्सा थोड़ी देर के बाद या कीवर्ड तक, किसी 0 कथन में परीक्षण के भाग , & & या || सूची, ...
"सब से बाहर निकलें"? स्पष्ट रूप से एक कमांड सूची के रूप में गिना जाता है; और bash -e ध्वज सबहेल के अंदर किसी भी कमांड पर लागू नहीं होगा। यह प्रयास करें:,
$ set -e
$ (echo before the error; false; echo after the error, status $?;) || echo after the subshell, status $?
before the error
after the error, status 1
$
क्योंकि subshell || द्वारा पीछा किया जाता है कि, चलाया जाता है यहां तक कि सेट -e के साथ "के बाद त्रुटि गूंज"। इतना ही नहीं, सबहेल 0 से बाहर निकलता है, क्योंकि वह "गूंज" भाग गया। तो "|| बाहर निकलें $?" "बाहर निकलें" भी नहीं चलाएगा। शायद हम नहीं चाहते थे!
जहाँ तक मुझे पता है, निम्न सूत्र बैश संस्करणों के साथ संगत है चाहे वे सबशेल के बाद bash -e का सम्मान करें या नहीं।
तुरंत बैश लिपि में हर subshell के समापन कोष्ठक के बाद निम्न पंक्ति जोड़ें:: -e ध्वज रीसेट किया जा करने के लिए होता है, तो यह भी सही ढंग से कार्य
case $?/$- in (0/*) ;; (*/*e*) exit $? ;; esaC# honor bash -e flag when subshell returns
स्रोत
2015-12-18 22:57:40
वहाँ पर कोई मौका है आप अपने बैश संस्करण को अपडेट कर सकते हैं, क्योंकि यह सटीक स्क्रिप्ट 4.1.5 में लक्षित है। शायद यह आपका 'झूठा' संस्करण –