2012-09-20 14 views
22

मेरे पास -e विकल्प सेट के साथ एक बैश स्क्रिप्ट है, जो पहली स्क्रिप्ट पर पूरी स्क्रिप्ट को विफल करता है।जब कोई विकल्प सेट किया गया है तो विफल होने से बैश स्क्रिप्ट से कैसे बचें?

लिपि में, मैं एक निर्देशिका पर ls करने की कोशिश कर रहा हूं। लेकिन वह पथ मौजूद हो सकता है या नहीं भी हो सकता है। यदि पथ मौजूद नहीं है, तो ls कमांड विफल रहता है, क्योंकि -e ध्वज सेट किया गया है।

क्या कोई तरीका है जिसके द्वारा मैं स्क्रिप्ट को विफल होने से रोक सकता हूं?

एक साइड नोट के रूप में, मैंने उस आदेश के पहले और बाद में set +e और set -e करने की चाल की कोशिश की है और यह काम करता है। लेकिन मैं कुछ बेहतर समाधान की तलाश में हूं।

उत्तर

30

आप का उपयोग कर सकते हैं "पकड़" त्रुटि || मौजूद नहीं है और एक कमांड की गारंटी 0 की स्थिति के साथ बाहर निकलने के लिए:

ls $PATH || echo "$PATH does not exist" 

के बाद से परिसर आदेश सफल होता है या नहीं, $PATH मौजूद है, set -e ट्रिगर नहीं किया गया है और आपकी स्क्रिप्ट बाहर नहीं निकल जाएगी।

चुपचाप त्रुटि को दबाने के लिए, आपको true आदेश का उपयोग कर सकते हैं:

ls $PATH || true 

कई आदेश पर अमल करने के लिए, आप परिसर से एक का उपयोग कर सकते हैं आदेश:

ls $PATH || { command1; command2; } 

या

ls $PATH || (command1; command2) 

बस सुनिश्चित करें कि यौगिक कमांड के अंदर कुछ भी विफल नहीं है। दूसरे उदाहरण में से एक लाभ यह है कि आप वर्तमान खोल में अपनी स्थिति को प्रभावित किए बिना subshell के अंदर तत्काल निकास मोड को बंद कर सकते हैं:

ls $PATH || (set +e; do-something-that-might-fail) 
+0

प्रतिक्रिया के लिए धन्यवाद। मुझे अभी भी कुछ संदेह हैं। यदि 'ls' कमांड विफल रहता है, तो यह अभी भी एक संदेश प्रिंट करता है, ताकि पथ डू स्नॉट मौजूद हो, क्या उसे दबाने का कोई तरीका है? साथ ही, 'OR' भाग में, कोड की 2 पंक्तियों को निष्पादित करने का कोई तरीका है? – Bhushan

2

एक समाधान फ़ोल्डर के अस्तित्व का परीक्षण किया जाएगा

function myLs() { 
    LIST="" 
    folder=$1 
    [ "x$folder" = "x" ] && folder="." 
    [ -d $folder ] && LIST=`ls $folder` 
    echo $LIST 
} 

इस तरह बैश असफल नहीं हो अगर $folder

5

एक अन्य विकल्प trap उपयोग करने के लिए EXIT संकेत को पकड़ने के लिए है:

trap 'echo "ls failed" ; some_rescue_action' EXIT 
ls /non_exist