bash - बैश स्क्रिप्ट में, यदि कोई निश्चित स्थिति होती है तो मैं पूरी स्क्रिप्ट से कैसे बाहर निकल सकता हूं?




scripting exit (4)

इस कथन का प्रयास करें:

exit 1

उपयुक्त त्रुटि कोड के साथ 1 बदलें। विशेष अर्थों के साथ बाहर निकलें कोड भी देखें।

मैं कुछ कोड का परीक्षण करने के लिए बैश में एक स्क्रिप्ट लिख रहा हूं। हालांकि, कोड को संकलित करने के लिए पहली जगह विफल होने पर परीक्षण चलाने के लिए मूर्खतापूर्ण प्रतीत होता है, इस मामले में मैं केवल परीक्षण रद्द कर दूंगा।

क्या कोई तरीका है कि मैं पूरे स्क्रिप्ट को थोड़ी देर के अंदर लपेटकर और ब्रेक का उपयोग किए बिना ऐसा कर सकता हूं? एक डुन डुन डुन गोटो की तरह कुछ?


एक बुरे गधे SysOps लड़के ने मुझे एक बार तीन फिंगर क्लॉ तकनीक सिखाया:

yell() { echo "$0: $*" >&2; }
die() { yell "$*"; exit 111; }
try() { "[email protected]" || die "cannot $*"; }

ये कार्य * NIX ओएस और खोल स्वाद-मजबूत हैं। उन्हें अपनी स्क्रिप्ट (बैश या अन्यथा) की शुरुआत में रखें, अपने कथन और कोड को try()

व्याख्या

( टिप्पणी के आधार पर)।

  • yell : स्क्रिप्ट नाम और स्क्रिप्टर के लिए सभी तर्क मुद्रित करें:
    • $0 स्क्रिप्ट का मार्ग है;
    • $* सभी तर्क हैं।
    • >&2 मतलब है > stdout को रीडायरेक्ट करें और पाइप 2पाइप 1 खुद stdout होगा।
  • die है जैसे yell , लेकिन एक गैर-0 निकास स्थिति के साथ बाहर निकलता है, जिसका अर्थ है "असफल"।
  • try करें || (बूलियन OR ), जो बाएं व्यक्ति विफल नहीं होने पर केवल दाएं तरफ का मूल्यांकन करता है।
    • [email protected] सभी तर्क फिर से हैं, लेकिन different ।

उम्मीद है कि सब कुछ बताता है।


मैं अक्सर त्रुटियों को संभालने के लिए रन () नामक एक फ़ंक्शन शामिल करता हूं। मैं जिस कॉल को बनाना चाहता हूं उसे इस फ़ंक्शन में पास कर दिया गया है, इसलिए जब विफलता प्रभावित होती है तो पूरी स्क्रिप्ट निकलती है। सेट-समाधान पर इसका लाभ यह है कि जब कोई लाइन विफल हो जाती है, तो स्क्रिप्ट चुपचाप बाहर नहीं निकलती है, और आपको बता सकती है कि समस्या क्या है। निम्नलिखित उदाहरण में, तीसरी पंक्ति निष्पादित नहीं की गई है क्योंकि स्क्रिप्ट कॉल पर झूठ बोलने से बाहर निकलती है।

function run() {
  cmd_output=$(eval $1)
  return_value=$?
  if [ $return_value != 0 ]; then
    echo "Command $1 failed"
    exit -1
  else
    echo "output: $cmd_output"
    echo "Command succeeded."
  fi
  return $return_value
}
run "date"
run "false"
run "date"

यदि आप source साथ स्क्रिप्ट का आह्वान करेंगे, तो आप return <x> उपयोग कर सकते हैं जहां <x> स्क्रिप्ट निकास स्थिति होगी (त्रुटि या गलत के लिए गैर-शून्य मान का उपयोग करें)। जब आप स्क्रिप्ट को source करते हैं, तो यह अपेक्षा के अनुसार भी काम करेगा। यदि आप निष्पादन योग्य स्क्रिप्ट (यानी, सीधे इसके फ़ाइल नाम के साथ) का आह्वान करते हैं, तो वापसी विवरण का परिणाम शिकायत होगा (त्रुटि संदेश "वापसी: केवल फ़ंक्शन या सोर्स की गई स्क्रिप्ट से 'वापसी' हो सकती है)।

अगर exit <x> का उपयोग किया जाता है, जब स्क्रिप्ट को source साथ बुलाया जाता है, तो परिणामस्वरूप स्क्रिप्ट को शुरू करने वाले शेल से बाहर निकल जाएगा, लेकिन निष्पादन योग्य स्क्रिप्ट सीधे ठीक से चलती है।

किसी भी स्क्रिप्ट में किसी भी मामले को संभालने के लिए, आप इसका उपयोग कर सकते हैं

return <x> 2> /dev/null || exit <x>

यह जो भी आमंत्रण उपयुक्त हो सकता है उसे संभालेगा।

नोट: <x> केवल एक संख्या माना जाना चाहिए।





exit-code