सटीक में प्रयुक्त भाषा एकल यूनिक्स विशिष्टता का वर्णन करने के का अर्थset -e
है:
जब यह विकल्प चालू होता है, यदि कोई साधारण आदेश शेल त्रुटियों के परिणामों में सूचीबद्ध किसी भी कारण से विफल हो जाता है या निकास स्थिति मान> 0 लौटाता है, और [सशर्त या नकारात्मक आदेश] नहीं है, तो शेल तुरंत बाहर निकल जाएगा।
इस तरह के आदेश एक उप-प्रकार में होने पर क्या होता है के रूप में एक अस्पष्टता है । व्यावहारिक दृष्टिकोण से, सभी उपधारा कर सकते हैं बाहर निकलें और एक गैर-मूल स्थिति को मूल शेल पर लौटाएं। क्या माता-पिता का खोल बारी-बारी से बाहर निकलेगा, यह इस बात पर निर्भर करता है कि क्या यह गैर-अभिभावक का दर्जा मूल शेल में विफल होने वाले साधारण कमांड में बदल जाता है।
इस तरह का एक समस्याग्रस्त मामला वह है जिसका आपने सामना किया था: कमांड प्रतिस्थापन से एक नॉनज़रो रिटर्न स्थिति । चूंकि इस स्थिति को अनदेखा किया जाता है, इसलिए यह मूल शेल से बाहर निकलने का कारण नहीं बनता है। जैसा कि आप पहले ही खोज चुके हैं , एक साधारण असाइनमेंट में कमांड प्रतिस्थापन का उपयोग करने के लिए एक्ज़िट स्थिति लेने का एक तरीका है : फिर असाइनमेंट की निकास स्थिति असाइनमेंट (एस) में अंतिम कमांड प्रतिस्थापन की निकास स्थिति है ।
ध्यान दें कि यह केवल एक ही कमांड प्रतिस्थापन के रूप में यदि केवल अंतिम प्रतिस्थापन की स्थिति को ध्यान में रखा जाता है, तो यह प्रदर्शन करेगा। उदाहरण के लिए, निम्न कमांड सफल है (मानक के अनुसार और मेरे द्वारा देखे गए प्रत्येक कार्यान्वयन में):
a=$(false)$(echo foo)
के लिए देखने के लिए एक और मामला है स्पष्ट subshells : (somecommand)
। ऊपर की व्याख्या के अनुसार, उपधारा एक गैर-स्थिति को वापस कर सकती है, लेकिन चूंकि यह मूल शेल में एक साधारण कमांड नहीं है, इसलिए मूल शेल जारी रखना चाहिए। वास्तव में, मुझे पता है कि सभी गोले इस बिंदु पर माता-पिता को वापस कर देते हैं। जबकि यह कई मामलों में उपयोगी होता है जैसे (cd /some/dir && somecommand)
कि कोष्ठक का उपयोग ऑपरेशन को रखने के लिए किया जाता है जैसे कि वर्तमान निर्देशिका परिवर्तन स्थानीय, यह उप-धारा set -e
में बंद होने पर विनिर्देश का उल्लंघन करता है, या यदि उप-अंश एक तरह से नॉनजेरो स्थिति देता है तो इसे समाप्त नहीं करेगा, जैसे कि !
एक सच्चे आदेश पर उपयोग करना। उदाहरण के लिए, foo
निम्नलिखित उदाहरणों को प्रदर्शित किए बिना ऐश, बैश, पीडीक्ष, ksh93 और zsh निकास के सभी :
set -e; (set +e; false); echo "This should be displayed"
set -e; (! true); echo "This should be displayed"
फिर भी कोई सरल आदेश set -e
प्रभाव में रहने के दौरान विफल रहा है!
एक तीसरा समस्याग्रस्त मामला एक नॉनट्रिवियल पाइपलाइन में तत्व है । व्यवहार में, सभी गोले पिछले एक के अलावा पाइपलाइन के तत्वों की विफलताओं को नजरअंदाज करते हैं, और अंतिम पाइपलाइन तत्व के बारे में दो व्यवहारों में से एक का प्रदर्शन करते हैं:
- ATT ksh और zsh, जो मूल शेल में पाइपलाइन के अंतिम तत्व को निष्पादित करते हैं, हमेशा की तरह व्यवसाय करते हैं: यदि पाइप लाइन के अंतिम तत्व में एक साधारण कमांड विफल रहता है, तो शेल उस कमांड को निष्पादित करता है, जो मूल शेल होता है, बाहर निकलता है।
- अन्य गोले बाहर निकलने से व्यवहार को अनुमानित करते हैं यदि पाइप लाइन का अंतिम तत्व एक नॉनज़रो स्थिति देता है।
पहले की तरह, set -e
पाइप लाइन के अंतिम तत्व में एक नकार को बंद करने या उपयोग करने से यह एक गैर-स्थिति को इस तरह से वापस करने का कारण बनता है जो शेल को समाप्त नहीं करना चाहिए; ATT ksh और zsh के अलावा अन्य गोले तब बाहर निकलेंगे।
बैश के pipefail
विकल्प के तहत पाइप लाइन तुरंत बाहर निकलने का कारण बनती है set -e
यदि इसके किसी भी तत्व को नॉनज़रो का दर्जा दिया जाता है।
ध्यान दें कि एक और जटिलता के रूप में, set -e
जब तक यह पॉसिक्स मोड में नहीं हो जाता है ( set -o posix
या POSIXLY_CORRECT
बैश शुरू होने पर वातावरण में होता है) तक सबश में बंद हो जाता है ।
यह सब दिखाता है कि POSIX विनिर्देश दुर्भाग्य से -e
विकल्प को निर्दिष्ट करने में खराब काम करता है । सौभाग्य से, मौजूदा गोले ज्यादातर उनके व्यवहार में सुसंगत हैं।