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