यह एक पुराना सवाल है, लेकिन यहां कोई भी उत्तर डेबियन पैकेज हैंडलिंग स्क्रिप्ट में set -e
उर्फ के उपयोग पर चर्चा नहीं करता है set -o errexit
। इन लिपियों में, डेबियन नीति के अनुसार इस विकल्प का उपयोग अनिवार्य है; आशय स्पष्ट रूप से एक अनहेल्ड त्रुटि स्थिति की किसी भी संभावना से बचने के लिए है।
व्यवहार में इसका मतलब यह है कि आपको यह समझना होगा कि आपके द्वारा चलाए जा रहे कमांड किस स्थिति में एक त्रुटि लौटा सकते हैं, और उन त्रुटियों में से प्रत्येक को स्पष्ट रूप से संभाल सकते हैं।
आम गोच उदाहरण हैं diff
(एक अंतर grep
होने पर एक त्रुटि देता है ) और (एक मैच नहीं होने पर एक त्रुटि देता है)। आप स्पष्ट हैंडलिंग के साथ त्रुटियों से बच सकते हैं:
diff this that ||
echo "$0: there was a difference" >&2
grep cat food ||
echo "$0: no cat in the food" >&2
(यह भी देखें कि हम संदेश में वर्तमान स्क्रिप्ट के नाम को शामिल करने के लिए कैसे ध्यान रखते हैं, और मानक उत्पादन के बजाय मानक त्रुटि के लिए नैदानिक संदेश लिख रहे हैं।)
यदि कोई स्पष्ट हैंडलिंग वास्तव में आवश्यक या उपयोगी नहीं है, तो स्पष्ट रूप से कुछ भी न करें:
diff this that || true
grep cat food || :
(शेल के :
नो-ऑप कमांड का उपयोग थोड़ा अस्पष्ट है, लेकिन आमतौर पर देखा जाता है।)
बस दोहराना है,
something || other
के लिए आशुलिपि है
if something; then
: nothing
else
other
fi
यानी हम स्पष्ट रूप से कहते हैं कि other
अगर और केवल something
विफल हो तो चलाया जाना चाहिए । लॉन्गहैंड if
(और अन्य शेल फ्लो कंट्रोल स्टेटमेंट जैसे while
, until
) एक एरर को हैंडल करने का एक वैध तरीका है (वास्तव में, अगर यह नहीं था, तो शेलset -e
में फ्लो कंट्रोल स्टेटमेंट नहीं हो सकते!)
और यह भी, बस स्पष्ट होने के लिए, इस तरह के एक हैंडलर की अनुपस्थिति में, set -e
यदि diff
कोई अंतर पाया गया, या grep
एक मैच नहीं मिला , तो पूरी स्क्रिप्ट त्रुटि के साथ तुरंत विफल हो जाएगी।
दूसरी ओर, कुछ कमांड्स त्रुटि निकास स्थिति का उत्पादन नहीं करते हैं जब आप उन्हें चाहते हैं। सामान्य रूप से समस्याग्रस्त कमांड हैं find
(बाहर निकलने की स्थिति प्रतिबिंबित नहीं करती है कि क्या फाइलें वास्तव में मिली थीं) और sed
(बाहर निकलने की स्थिति से पता नहीं चलेगा कि स्क्रिप्ट को कोई इनपुट प्राप्त हुआ या वास्तव में किसी भी कमांड को सफलतापूर्वक निष्पादित किया गया है)। कुछ परिदृश्यों में एक साधारण गार्ड एक कमांड पर पाइप करना है जो आउटपुट नहीं होने पर चिल्लाता है:
find things | grep .
sed -e 's/o/me/' stuff | grep ^
यह ध्यान दिया जाना चाहिए कि पाइपलाइन की निकास स्थिति उस पाइपलाइन में अंतिम कमांड की निकास स्थिति है। इसलिए उपरोक्त आदेश वास्तव में find
और की स्थिति को पूरी तरह से मुखौटा करते हैं sed
, और केवल आपको बताते हैं कि क्या grep
अंत में सफल हुआ।
(बैश, ज़ाहिर है set -o pipefail
, लेकिन; डेबियन पैकेज स्क्रिप्ट बैश सुविधाओं का उपयोग नहीं कर सकते। नीति sh
इन लिपियों के लिए POSIX के उपयोग को दृढ़ता से निर्धारित करती है , हालांकि यह हमेशा ऐसा नहीं था।)
कई स्थितियों में, यह रक्षात्मक रूप से कोडिंग के लिए अलग से देखने के लिए कुछ है। कभी-कभी आपको उदाहरण के लिए एक अस्थायी फ़ाइल से गुजरना पड़ता है ताकि आप देख सकें कि क्या कमांड जो उस आउटपुट को सफलतापूर्वक तैयार करता है, भले ही मुहावरे और सुविधा अन्यथा आपको शेल पाइपलाइन का उपयोग करने के लिए निर्देशित करेगी।