2015-01-06 8 views
12

मैं अपने लिपियों में इस तरह एक साधारण बैश प्रस्तावना का उपयोग कर के साथ बैश में -e/सेट + ई सेट का उपयोग:कार्यों

#!/bin/bash 
set -e 

प्रतिरूपकता के साथ संयोजन के रूप में/कार्य का उपयोग कर यह मेरे आज काट लिया है।

तो, कहते हैं कि मैं कहीं की तरह

foo() { 
    #edit: some error happens that make me want to exit the function and signal that to the caller 
    return 2 
} 

एक समारोह है आदर्श रूप में मैं कई छोटे फ़ाइलों का उपयोग करने में सक्षम होना चाहते हैं, अन्य फ़ाइलों में अपने कार्यों में शामिल हैं और फिर

set +e 
foo 
rc=$? 
set -e 
की तरह इन कार्यों फोन

। यह दिनचर्या की बिल्कुल दो परतों के लिए काम करता है। लेकिन अगर foo उस तरह subroutines को भी बुला रहा है, तो वापसी से पहले अंतिम सेटिंग set -e होगी, जो रिटर्न पर स्क्रिप्ट से बाहर निकल जाएगी - मैं इसे कॉलिंग फ़ंक्शन में ओवरराइड नहीं कर सकता। तो, मुझे क्या करना पड़ा है

foo() { 
    #calling bar() in a shielded way like above 
    #..  

    set +e 
    return 2 
} 

कौन सा मुझे लगता है बहुत counterintuitive (और यह भी कि मैं क्या नहीं करना चाहता - क्या हुआ अगर कुछ संदर्भों में मैं, विफलताओं के खिलाफ परिरक्षण के बिना समारोह का उपयोग करने के, जबकि अन्य संदर्भों में करना चाहते हैं मैं सफाई को संभालना चाहता हूं?) इसे संभालने का सबसे अच्छा तरीका क्या है? Btw। मैं ओएसएक्स पर ऐसा कर रहा हूं, मैंने परीक्षण नहीं किया है कि यह व्यवहार लिनक्स पर अलग है या नहीं।

+0

प्रतीक्षा करें, क्या आप विस्तार कर सकते हैं? क्या मैं इसे कॉलर में जोड़ूं? कोलन क्या करता है? –

+0

क्या आप विस्तार कर सकते हैं कि मैं वापसी का दुरुपयोग कैसे कर रहा हूं? एक समारोह में त्रुटि को सिग्नल करने का मेरा मतलब कैसा है? (खेद है कि अगर मैं पर्याप्त स्पष्ट नहीं था - 'वापसी 2' केवल एक त्रुटि स्थिति में किया जाता है। –

+1

आप नहीं हैं, लेकिन मैंने सोचा था कि आप थे। मेरा बुरा, क्षमा करें। – Carpetsmoker

उत्तर

13

शैल फ़ंक्शंस में वास्तव में "वापसी मूल्य" नहीं हैं, बस कोड से बाहर निकलें।

आप कॉलर को && : जोड़ सकता है, इस आदेश "का परीक्षण किया" है, और यह बाहर निकलने नहीं होगा:

foo() { 
    echo 'x' 
    return 42 
} 

out=$(foo && :) 
echo $out 

: "शून्य आदेश" (यानी यह काम नहीं करता है। कुछ भी)। इस मामले में इसे निष्पादित भी नहीं किया जाता है, क्योंकि यह केवल foo वापसी 0 (जो यह नहीं करता) चलाता है।

यह आउटपुट:

x 

यह यकीनन एक सा बदसूरत है, लेकिन फिर, शेल पटकथा लेखन के सभी यकीनन थोड़ा बदसूरत ;-)

FreeBSD, जो से बेहतर बताते से sh(1) का हवाला देते हुए है बैश का मैन पेज:

-e errexit 
     Exit immediately if any untested command fails in non-interactive 
     mode. The exit status of a command is considered to be explicitly 
     tested if the command is part of the list used to control an if, 
     elif, while, or until; if the command is the left hand operand of 
     an “&&” or “||” operator; or if the command is a pipeline preceded 
     by the ! operator. If a shell function is executed and its exit 
     status is explicitly tested, all commands of the function are con‐ 
     sidered to be tested as well. 
+0

(अरे, टिप्पणियों में कोई न्यूलाइन नहीं;))। धन्यवाद दोस्त। मुझे अब दिख गया। तो अब से, यदि मैं किसी फ़ंक्शन को 'परीक्षण' तरीके से निष्पादित करना चाहता हूं, तो मैं सेट + ई foo &&: आरसी = $ कर दूंगा? सेट- –

+1

@ मिशेलमुलर आपको 'सेट' के साथ कुछ भी करने की आवश्यकता नहीं है; आप अपनी स्क्रिप्ट में इसे सक्षम करने के लिए केवल 'set -e' का उपयोग करते हैं, और फिर "इसे बाधित" करने के लिए, जैसा कि था, '&&:' का उपयोग करें। – Carpetsmoker

+0

सही, समझ में आता है। धन्यवाद। –

संबंधित मुद्दे