2012-10-22 17 views
7

मैं त्रुटियों को रोकने के लिए set -e का उपयोग कर रहा हूं।बैश त्रुटि को अनदेखा करें और वापसी कोड प्राप्त करें

लेकिन विशेष रूप से एक फ़ंक्शन के लिए मैं त्रुटि को अनदेखा करना चाहता हूं और त्रुटि पर मैं फ़ंक्शन का रिटर्न कोड चाहता हूं।

उदाहरण:

do_work || true 
if [ $? -ne 0 ] 
    then 
    echo "Error" 
    fi 

लेकिन यह वापसी कोड काम नहीं कर रहा है हमेशा सच की वजह से है || सच

त्रुटि पर do_work पर वापसी कोड कैसे प्राप्त करें?

+0

आप उस कॉल से ठीक पहले त्रुटि पर बाहर निकलने को अक्षम क्यों नहीं करते? – Mat

+0

@ मैट या यह धन्यवाद काम करेगा। लेकिन ज्ञान के उद्देश्य के लिए एक तरीका है कि मैं रिटर्न कोड कैप्चर कर सकता हूं? –

उत्तर

6
do_work || { 
    status=$? 
    echo "Error" 
} 
4

आप एक subshell शॉर्टकट इस्तेमाल कर सकते हैं:

(set +e; do_work) 
if [ $? -ne 0 ] 
    then 
    echo "Error" 
    fi 

आशा इस मदद करता है =)

4

एक तरह से एक पाइप का उपयोग करना है, -e केवल एक पाइप के दाएँ सबसे परिणाम पर लग रहा है:

:
set -e 

do_work | true 

retn=${PIPESTATUS[0]} 
if (($retn != 0)) 
then 
    echo "Error $retn" 
fi  
echo Ending 

मैं एक साधारण do_work जो सिर्फ exit 42 किया था और निम्न उत्पादन मिला लिखा था

Error 42 
Ending 

PIPESTATUS सरणी बैश द्वारा बनाए रखा जाता है, प्रत्येक तत्व पाइपलाइन के प्रत्येक भाग का रिटर्न कोड देता है। हमें इसे एक बार में कैप्चर करने की आवश्यकता है (इसलिए $retn) क्योंकि यह प्रत्येक कमांड पर अधिलेखित है।

बेशक यह समस्याग्रस्त हो सकती है यदि आपके do_work में एक पाइप स्वयं शामिल है।

1
do_work || status=$? 
if [ $status -ne 0 ] 
then 
    echo "Oh no - Fail whale $status has arrived" 
fi 
4

यहां दिए गए उत्तर के कई क्योंकि वे एक चर संयुक्त राष्ट्र से परिभाषित करता है, तो do_work सफल हो जाएगा कि के खिलाफ एक टेस्ट में परिणाम, सही नहीं हैं।

हम सफल मामले को कवर करने के साथ-साथ की जरूरत है ताकि जवाब है:

set -eu 
do_work && status=0 || status=1 

पोस्टर के सवाल एक छोटे से अस्पष्ट है, क्योंकि यह "त्रुटि मैं लौट कोड चाहते हैं पर" पाठ में कहते हैं, लेकिन फिर

set -e 

do_work() { 
    return 0 
} 

status=123 

do_work || status=$? 
echo $status 

इस कोड को मुद्रित मूल्य 123 है, और नहीं 0 के रूप में हम ज सकता है: कोड का तात्पर्य

इसे समझने के लिए "मैं हमेशा वापसी कोड चाहते हैं", यहाँ समस्याग्रस्त कोड है के लिए ओपे

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