निष्पादन (exit 1);एक ERRजाल को ट्रिगर करने का सबसे सरल तरीका है । यह set -eप्रभावी होने पर तत्काल निकास को भी ट्रिगर करेगा । (त्रुटि स्थिति को ट्रिगर करने के लिए विफल होने के लिए एक कमांड की आवश्यकता होती है; exitएक उपधारा में असफलता मान के कारण उपसर्ग विफल हो जाता है।)
exit 1; उन चीजों में से कोई भी नहीं करेगा।
तो {(exit 1); exit 1;}पहले ERRजाल का उत्पादन करने के लिए इस्तेमाल किया जा सकता है , जो डिबगिंग उद्देश्यों के लिए कुछ उपयोगी हो सकता है, और फिर एक त्रुटि संकेत के साथ स्क्रिप्ट को समाप्त कर सकता है।
लेकिन autoconfफाइलों में ऐसा नहीं है । autoconfस्क्रिप्ट EXITरन के दौरान बनाई गई अस्थायी फ़ाइलों को साफ करने के लिए जाल पर भरोसा करते हैं। सहित अधिकांश गोले, जाल को कॉल करने से पहले कमांड bashमें दिए गए मूल्य से स्थिति निर्धारित करेंगे । यह जाल को यह पता लगाने की अनुमति दे सकता है कि क्या यह एक त्रुटि से या सामान्य समाप्ति से आह्वान किया गया था, और यह भी यह सुनिश्चित करने की अनुमति देता है कि बाहर निकलने की स्थिति सही ढंग से जाल ऑपरेशन के अंत में सेट की गई है।exitEXITEXIT
हालांकि, जाहिरा तौर पर कुछ गोले सहयोग नहीं करते हैं। यहाँ autoconfमैनुअल से एक उद्धरण है :
कुछ शेल स्क्रिप्ट, जैसे कि उत्पन्न होने वाले autoconf, बाहर निकलने से पहले साफ करने के लिए एक जाल का उपयोग करते हैं। यदि अंतिम शेल कमांड नॉनज़ेरो स्टेटस के साथ बाहर निकलता है, तो ट्रैप नॉनज़रो स्टेटस के साथ भी बाहर निकलता है, ताकि इनवोकर यह बता सके कि कोई त्रुटि हुई है।
दुर्भाग्य से, कुछ गोले में, जैसे कि सोलारिस /bin/sh, एक निकास जाल निकास कमांड के तर्क को अनदेखा करता है। इन गोले में, एक जाल यह निर्धारित नहीं कर सकता है कि यह सादे निकास द्वारा या निकास द्वारा आह्वान किया गया था 1. सीधे निकास से कॉल करने के बजाय, उस AC_MSG_ERRORमैक्रो का उपयोग करें जिसमें इस समस्या के लिए समाधान है।
वर्कअराउंड यह सुनिश्चित करने के लिए है कि कमांड निष्पादित होने से पहले$? बाहर निकलने की स्थिति है, ताकि ट्रैप निष्पादित होने पर इसका मूल्य निश्चित रूप से होगा । और, वास्तव में, यह मैक्रो है जो उस उत्सुक कोड को सम्मिलित करता है, निरर्थक ब्रेसिज़ के साथ पूरा होता है।exitEXITAC_MSG_ERROR
falseइसके बजाय सिर्फ निष्पादन क्यों नहीं(exit 1)?