2010-01-25 22 views
85

एक बैश स्क्रिप्ट set -e है, और स्क्रिप्ट में एक कमांड एक त्रुटि देता है, कैसे मैं कुछ सफाई से पहले स्क्रिप्ट बाहर निकल जाता है कर सकते हैं?बैश स्क्रिप्ट से पहले कमांड कैसे चलाएं?

उदाहरण के लिए:

#!/bin/bash 
set -e 
mkdir /tmp/foo 
# ... do stuff ... 
rm -r /tmp/foo 

मैं, यह कैसे सुनिश्चित कर सकते हैं कि /tmp/foo निकाल दिया जाता है, भले ही में ... do stuff ... विफल रहता है कोई एक आदेश?

उत्तर

131

यहाँ जाल का उपयोग करने का एक उदाहरण है:

#!/bin/bash 
set -e 
function cleanup { 
    echo "Removing /tmp/foo" 
    rm -r /tmp/foo 
} 
trap cleanup EXIT 
mkdir /tmp/foo 
asdffdsa #Fails 

आउटपुट:

[email protected]:~ $ sh traptest 
t: line 9: asdffdsa: command not found 
Removing /tmp/foo 
[email protected]:~ $ 

सूचना है कि भले ही asdffdsa लाइन में विफल रहा है, सफाई अभी भी मार डाला गया था।

5

set के लिए संदर्भ से:

-e

बाहर निकलें तुरंत अगर एक साधारण आदेश (देखें खंड 3.2.1 सरल कमांड), एक गैर शून्य की स्थिति के साथ बाहर निकल जाता है, जब तक कि आदेश जो असफल रहता है, एक लूप का हिस्सा है, अगर एक कथन का हिस्सा है, & & या || सूची, या अगर कमांड की वापसी स्थिति का उपयोग कर उलटा जा रहा है! सेट होने पर ईआरआर पर एक जाल को खोलने से पहले निष्पादित किया जाता है।

(जोर मेरा)।

9

bash मैनपेज से (के विषय में builtins):

जाल [-lp] [[आर्ग] sigspec ...]
आदेश आर्ग पढ़ने के लिए जाता है और मार डाला जब खोल संकेत प्राप्त (एस) sigspec।

तो, के रूप में Anon.'s answer में संकेत दिया, जल्दी लिपि में trap फोन हैंडलर आप ERR पर इच्छा स्थापित करने के लिए।

+3

आप एक्स्टिट पर भी जाल कर सकते हैं। –

+0

बिल्ट-इन पर कुछ मदद देखने के लिए 'सहायता जाल' चलाएं। – Flimm

6

संकेतों को फंसाने और सेट-संबंधित पर आपके लिए reference है। एक नज़र देख लो।

+0

वही है जो मैं आपको धन्यवाद देने के लिए देख रहा था। – nelaaro

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