2009-09-04 12 views
11

मैं एक बैश स्क्रिप्ट लिख रहा हूं और मेरे पास errexit सेट है, इसलिए यदि कोई आदेश 0 निकास कोड वापस नहीं करता है, तो स्क्रिप्ट मर जाएगी, यानी यदि कोई आदेश सफलतापूर्वक पूरा नहीं होता है। यह सुनिश्चित करना है कि मेरी बैश स्क्रिप्ट मजबूत है।बैश स्क्रिप्ट - एक डिवाइस को उतारो, लेकिन अगर यह आरोहित नहीं है तो असफल न हों?

मुझे कुछ फाइल सिस्टम को माउंट करना है, कुछ फाइलों को कॉपी करना है, इसे umount करें। मैं शुरुआत में umount /mnt/temp डाल रहा हूं ताकि यह कुछ भी करने से पहले इसे उछाल दे। हालांकि अगर यह आरोहित नहीं है तो umount विफल हो जाएगा और मेरी स्क्रिप्ट को रोक देगा।

क्या umount --dont-fail-if-not-mounted /mnt/temp करना संभव है? तो अगर डिवाइस घुड़सवार नहीं है तो यह 0 वापस आ जाएगा? rm -f की तरह?

umount .... || /bin/true 

उत्तर

28

वापसी कोड की अनदेखी करने के मानक चाल एक बूलियन अभिव्यक्ति है कि हमेशा सफलता के लिए मूल्यांकन करता है में आदेश रैप करने के लिए है ऐसा:

umount … || [ $? -eq 1 ] 
कोई

फिर बैश कोई त्रुटि है, तो umount रिटर्न 0 या 1 (यानी unmounts सफलतापूर्वक या डिवाइस माउंट नहीं किया गया) मान लेंगे लेकिन स्क्रिप्ट बंद हो जाएगा अगर किसी अन्य कोड दिया जाता है (उदाहरण के लिए आपके पास डी को अनमाउंट करने की अनुमतियां evice)।

+1

और आउटपुट को/dev/null पर रीडायरेक्ट करें: umount ...>/dev/null 2> & 1 ||/bin/true – knittl

+0

ठीक है, यह क्रमिक स्थिति है। जारी रखने के इच्छुक स्क्रिप्ट की कल्पना करना आसान है, लेकिन लॉग स्ट्रीम में कोई त्रुटि संदेश छोड़ दें। –

+6

आप इसे/bin/true (जो एक नई प्रक्रिया बनाता है) के बजाय छद्म-आदेश ':' (एक खोल निर्मित) का उपयोग कर थोड़ा तेज़ कर सकते हैं। यही है, "umount .... ||:' " –

5

यह मानते हुए कि आपके umount रिटर्न 1 डिवाइस माउंट नहीं किया गया, तो आप कर सकते हैं:

+1

मैंने परीक्षण किया और वापसी के लिए दोनों वापसी के साथ उछाल छोड़ दिया और घुड़सवार नहीं किया गया, इसलिए दोनों मामलों को अकेले रिटर्न कोड के आधार पर अलग करना संभव नहीं है। –

2

मुझे बस ":" अधिक उपयोग पूर्ण मिला और एक समान समाधान चाहता था, लेकिन स्क्रिप्ट को यह पता होना चाहिए कि क्या हो रहा है।

umount ...... || { echo "umount failed but not to worry" ; : ; } 

यह संदेश के साथ सच साबित होता है, हालांकि उमाउंट विफल हुआ।

+0

इस उद्देश्य के लिए अधिकांश बार "/ bin/true" का उपयोग करना अधिक उपयोगी होता है, तो इसे पढ़ने और देखने का अर्थ यह आसान होता है। – anydot

+0

'{}' और 'नहीं हैं; :; यहाँ अनावश्यक? मैंने परीक्षण किया तो 'झूठी || गूंज 1; फिर ठीक गूंज; फाई 'और आउटपुट' झूठी || के समान था {echo 1; :; }; फिर ठीक गूंज; fi'। – Desty

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