2008-12-15 14 views
28

मान लीजिए कि एक खोल स्क्रिप्ट (/ bin/sh या/bin/bash) में कई कमांड हैं। अगर किसी भी कमांड में असफल निकास की स्थिति है तो मैं स्क्रिप्ट को साफ़ कर सकता हूं? जाहिर है, अगर कोई ब्लॉक और/या कॉलबैक का उपयोग कर सकता है, लेकिन क्या एक क्लीनर, अधिक संक्षिप्त तरीका है? & & का उपयोग करना वास्तव में एक विकल्प नहीं है, क्योंकि आदेश लंबे समय तक हो सकते हैं, या लिपि में लूप और सशर्त जैसे गैर-छोटी चीजें हो सकती हैं।शैल स्क्रिप्टिंग: किसी भी त्रुटि पर मरें

उत्तर

52
मानक sh और bash साथ

, आप कर सकते हैं

set -e 

यह होगा

$ help set 
... 
     -e Exit immediately if a command exits with a non-zero status. 

यह भी zsh साथ (मैं क्या इकट्ठा कर सकता से) काम करता है। यह किसी भी बोर्न शैल वंश के लिए भी काम करना चाहिए।

csh/ tcsh साथ

, आप #!/bin/csh -e

+0

धन्यवाद, यह मैं क्या चाहते हो रहा है। मुझे अपने Google fu को तेज करना चाहिए, मुझे लगता है ... :) – Pistos

+3

ध्यान दें कि सशर्त में आदेश स्क्रिप्ट को बाहर निकलने के बिना विफल हो सकते हैं - जो महत्वपूर्ण है। उदाहरण के लिए: यदि grep कुछ/कुछ/कहाँ; तब: यह पाया गया था; अन्यथा: यह नहीं मिला था; फाई ठीक काम करता है, इस पर ध्यान दिए बिना कि कुछ/कुछ/कहां पाया जाता है। –

+0

आप "मानक sh" कहते हैं। क्या इसका मतलब यह है कि यह पॉज़िक्स है? संपादित करें: मैंने इसे देखा है और यह POSIX है: http://pubs.opengroup.org/onlinepubs/009695399/utilities/set.html – Taywee

16

साथ अपनी स्क्रिप्ट शुरू करने के लिए आप इस्तेमाल कर सकते हैं हो सकता है है:

$ <any_command> || exit 1 
+1

यह पैटर्न ** व्यक्तिगत आदेशों की विफलता पर चुनिंदा रूप से बाहर निकलने के लिए उपयोगी है ** और ** ** यदि आप कस्टम त्रुटि संदेश ** पहले प्रिंट करना चाहते हैं। उत्तरार्द्ध करने के लिए, ' जैसे कुछ का उपयोग करें || eval 'echo "कृपया सुनिश्चित करें ..." 1> और 2; बाहर निकलें 1'' नोट: 'evcho' चाल' echo' और 'exit' आदेशों को समूहबद्ध करने के लिए _sub_-shell बनाने के बिना आवश्यक है; उप-खोल का उपयोग (जैसा कि यदि आप ब्रांड्स का उपयोग करते हैं तो होगा) 'निकास' अप्रभावी प्रदान करेगा। – mklement0

+14

लाइव और जानें: बैश में कमांड-ग्रुपिंग सुविधा है, इसलिए मैंने उल्लेख की गई 'eval' चाल की आवश्यकता नहीं है। इसके बजाय, ' || का उपयोग करें {echo "कृपया सुनिश्चित करें ..." 1> और 2; बाहर जाएं; } '(बंद होने से पहले आवश्यक'; 'नोट करें '}'। – mklement0

0

आप $ देख सकते हैं? क्या सबसे हाल ही में बाहर निकलने के कोड है देखने के लिए ..

, उदा,

#!/bin/sh 
# A Tidier approach 

check_errs() 
{ 
    # Function. Parameter 1 is the return code 
    # Para. 2 is text to display on failure. 
    if [ "${1}" -ne "0" ]; then 
    echo "ERROR # ${1} : ${2}" 
    # as a bonus, make our script exit with the right error code. 
    exit ${1} 
    fi 
} 

### main script starts here ### 

grep "^${1}:" /etc/passwd > /dev/null 2>&1 
check_errs $? "User ${1} not found in /etc/passwd" 
USERNAME=`grep "^${1}:" /etc/passwd|cut -d":" -f1` 
check_errs $? "Cut returned an error" 
echo "USERNAME: $USERNAME" 
check_errs $? "echo returned an error - very strange!" 
+1

-1: यह एक बहुत ही लगातार एंटीपाटर है। @ बरुन का समाधान सरल और अधिक मूर्खतापूर्ण है। – tripleee

+0

उपरोक्त के समान स्क्रिप्ट, लेकिन एक "टियरियर दृष्टिकोण" (सभी एक पंक्ति पर) के रूप में: foo = $ (grep "^ $ {1}"/etc/passwd) && foo = $ (echo "$ foo" | कट -d: -f1) && echo ok || echo not_ok (एनबी: यदि बैश का उपयोग करना है, और sh तक सीमित नहीं है, तो कोई पाइपलाइन के किसी भी हिस्से की निकास स्थिति प्राप्त कर सकता है, जो grep/cut logic को सरल बनाता है।) – michael

+0

बस सेट -e – Codefor