सुरक्षित पक्ष पर होने के लिए, मैं एक स्क्रिप्ट के निष्पादन को रोकना चाहूंगा अगर यह एक सिंटैक्स त्रुटि का सामना करता है।
मेरे आश्चर्य के लिए, मैं यह हासिल नहीं कर सकता। ( set -e
पर्याप्त नहीं है।) उदाहरण:
#!/bin/bash
# Do exit on any error:
set -e
readonly a=(1 2)
# A syntax error is here:
if (( "${a[#]}" == 2 )); then
echo ok
else
echo not ok
fi
echo status $?
echo 'Bad: has not aborted execution on syntax error!'
परिणाम (bash-3.2.39 या bash-3.2.51):
$ ./sh-on-syntax-err
./sh-on-syntax-err: line 10: #: syntax error: operand expected (error token is "#")
status 1
Bad: has not aborted execution on syntax error!
$
$?
वाक्यविन्यास त्रुटियों को पकड़ने के लिए हम हर कथन के बाद जाँच नहीं कर सकते ।
(मुझे समझदार प्रोग्रामिंग भाषा से इस तरह के सुरक्षित व्यवहार की उम्मीद थी ... शायद इसे बग / डेवलपर्स को कोसने की इच्छा के रूप में रिपोर्ट किया जाना चाहिए)
अधिक प्रयोग
if
कोई फर्क नहीं पड़ता।
हटाना if
:
#!/bin/bash
set -e # exit on any error
readonly a=(1 2)
# A syntax error is here:
(( "${a[#]}" == 2 ))
echo status $?
echo 'Bad: has not aborted execution on syntax error!'
परिणाम:
$ ./sh-on-syntax-err
./sh-on-syntax-err: line 6: #: syntax error: operand expected (error token is "#")
status 1
Bad: has not aborted execution on syntax error!
$
शायद, यह http://mywiki.wooledge.org/BashFAQ/105 से 2 व्यायाम से संबंधित है और इसके साथ कुछ करना है (( ))
। लेकिन मुझे अभी भी एक वाक्यविन्यास त्रुटि को निष्पादित करने के लिए जारी रखना अनुचित है।
नहीं, (( ))
कोई फर्क नहीं पड़ता!
यह अंकगणित परीक्षण के बिना भी बुरा व्यवहार करता है! बस एक सरल, मूल स्क्रिप्ट:
#!/bin/bash
set -e # exit on any error
readonly a=(1 2)
# A syntax error is here:
echo "${a[#]}"
echo status $?
echo 'Bad: has not aborted execution on syntax error!'
परिणाम:
$ ./sh-on-syntax-err
./sh-on-syntax-err: line 6: #: syntax error: operand expected (error token is "#")
status 1
Bad: has not aborted execution on syntax error!
$
set -e
काम नहीं किया है। लेकिन मेरा सवाल अभी भी समझ में आता है। क्या किसी भी सिंटैक्स त्रुटि पर गर्भपात करना संभव है?
set -e
पर्याप्त नहीं है क्योंकि आपके वाक्यविन्यास में त्रुटि हैif
। कहीं भी स्क्रिप्ट को निरस्त करना चाहिए।