क्या करता है `{{(निकास 1); बाहर निकलें 1; }; } `मतलब?


28

मैंने अगला कोड स्निपेट config.statusजनरेट किया था configure

if test ! -f "$as_myself"; then
{ { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
{ (exit 1); exit 1; }; }
fi

कोड स्निपेट में, क्या करता { (exit 1); exit 1; };है? केवल exitएक उपधारा में करने का उद्देश्य क्या है ?

जवाबों:


33

निष्पादन (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)?
रुसलान

3
@ रोलन: दो समस्याएं। (1) सबसे महत्वपूर्ण: falseआपको स्टेटस कोड सेट नहीं करने देता है और न ही शून्य स्थिति क्या है, इसकी कोई गारंटी नहीं है। (2) falseआमतौर पर एक बेसिन नहीं है, इसलिए इसे एक बच्चे की प्रक्रिया की आवश्यकता होती है; इसके विपरीत, अधिकांश गोले एक बच्चे को संभालने के लिए पैदा करने से बच सकते हैं (exit 1)
रिसी

8

इसके लिए कोई उद्देश्य नहीं है जहाँ तक मैं देख सकता हूँ, ऐसा कुछ भी नहीं है जो सीधे उपखंड शुरू करके प्राप्त किया जा सकता है और फिर तुरंत बाहर निकल सकता है।

इस तरह की चीजें सबसे अधिक संभावना है कि स्वचालित रूप से कोड उत्पन्न करने का एक साइड इफेक्ट है - कुछ मामलों में उप-धारा में निष्पादित अन्य आदेश हो सकते हैं जहां कोई exit 1मतलब होता है। अंततः एक अच्छा मौका है कि पीढ़ी कोड को किसी तरह से कुछ बयानों को सम्मिलित करने की अनुमति देकर सरल बनाया जाता है, जिसमें कुछ मामलों में कोई फ़ंक्शन नहीं होता है और हर बार एक बार 'क्लीन कोड' उत्पन्न करना अधिक जटिल होता है। या तो वह या जो कोड उत्पन्न किया गया है वह सिर्फ खराब लिखा गया है :)

का उदारवादी प्रयोग {...}इसका एक और उदाहरण है, उनमें से ज्यादातर बेमानी हैं, लेकिन कोड लिखना आसान है जो उन्हें हर मामले में सम्मिलित करता है (शायद कुछ में आप ब्लॉक के आउटपुट / इनपुट को पुनर्निर्देशित करना चाहते हैं) वे जहां उनकी जरूरत नहीं है और उन्हें छोड़ देना चाहिए।


इसका एक उद्देश्य है। @ रिसी का जवाब देखें।
ओल्ड प्रो

1

(exit 1)एक सरल तरीका है, एक निश्चित निकास कोड प्राप्त करने का सबसे सरल तरीका (1 के विशेष मामले में आसान तरीके हैं, निश्चित रूप से)। लेकिन यह इस मामले में कारण नहीं है क्योंकि बाहर निकलने के कोड की जांच नहीं की जाती है।

exitएक उपधारा में डालने का उद्देश्य स्क्रिप्ट से बाहर नहीं निकल सकता है (हालांकि एक निश्चित निकास कोड की पीढ़ी के लिए निकास का उपयोग करना)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.