bash - त्रुटि पर बैश खोल स्क्रिप्ट से स्वचालित निकास




shell exit (5)

इसे pipefail के साथ संयोजन में प्रयोग करें।

set -e
set -o pipefail

-e (errexit): पहली त्रुटि पर स्क्रिप्ट को छोड़ दें, जब कोई आदेश शून्य-शून्य स्थिति से बाहर निकलता है (जब तक लूप, यदि-परीक्षण, सूची संरचनाओं को छोड़कर)

-o पाइपफेल: पाइपलाइन में अंतिम कमांड की निकास स्थिति को वापस करने के लिए एक पाइपलाइन का कारण बनता है जो गैर-शून्य रिटर्न मान लौटाता है।

अध्याय 33. विकल्प

मैं कुछ शेल स्क्रिप्ट लिख रहा हूं और यदि कोई आदेश विफल हुआ तो कहा गया था कि अगर मैं शेल स्क्रिप्ट के निष्पादन को रोकने की क्षमता रखता हूं तो मुझे यह उपयोगी लगेगा। उदाहरण के लिए नीचे देखें:

#!/bin/bash  

cd some_dir  

./configure --some-flags  

make  

make install

तो इस मामले में यदि स्क्रिप्ट संकेतित निर्देशिका में परिवर्तित नहीं हो सकती है तो यह निश्चित रूप से विफल होने पर बाद में ./configure नहीं करना चाहती है।

अब मुझे अच्छी तरह से पता है कि अगर प्रत्येक आदेश के लिए मुझे जांच हो सकती है (जो मुझे लगता है कि एक निराशाजनक समाधान है), लेकिन क्या कोई आदेश विफल होने पर स्क्रिप्ट से बाहर निकलने के लिए वैश्विक सेटिंग है?


एक मुहावरे है:

cd some_dir && ./configure --some-flags && make && make install

मुझे एहसास है कि लंबे समय तक मिल सकता है, लेकिन बड़ी लिपियों के लिए आप इसे तार्किक कार्यों में तोड़ सकते हैं।


मुझे लगता है कि आप जो खोज रहे हैं वह trap कमांड है:

trap command signal [signal ...]

अधिक जानकारी के लिए, यह पृष्ठ देखें।

एक और विकल्प आपकी स्क्रिप्ट के शीर्ष पर set -e कमांड का उपयोग करना है - यदि कोई प्रोग्राम / कमांड एक वास्तविक सत्य देता है तो यह स्क्रिप्ट से बाहर निकल जाएगा।


यहां है कि इसे कैसे करना है:

#!/bin/sh

abort()
{
    echo >&2 '
***************
*** ABORTED ***
***************
'
    echo "An error occurred. Exiting..." >&2
    exit 1
}

trap 'abort' 0

set -e

# Add your script below....
# If an error occurs, the abort() function will be called.
#----------------------------------------------------------
# ===> Your script goes here
# Done!
trap : 0

echo >&2 '
************
*** DONE *** 
************
'

set -e बिल्टिन का प्रयोग करें:

#!/bin/bash
set -e
# Any subsequent(*) commands which fail will cause the shell script to exit immediately

वैकल्पिक रूप से, आप कमांड लाइन पर पास कर सकते हैं:

bash -e my_script.sh

आप इस व्यवहार को set +e साथ अक्षम भी कर सकते हैं।

(*) ध्यान दें:

यदि विफल रहता है तो शेल बाहर नहीं निकलता है, थोड़ी देर के बाद या कीवर्ड तक , कमांड सूची का हिस्सा होता है, यदि परीक्षण के भाग का हिस्सा है या आरक्षित शब्दों के बाद, किसी और आदेश में निष्पादित किसी भी कमांड का हिस्सा है। अंतिम और& या || के बाद कमांड को छोड़कर सूची , पाइपलाइन में कोई भी कमांड लेकिन अंतिम, या यदि कमांड का रिटर्न वैल्यू उलटा जा रहा है !

( man bash )





exit