`सेट -e` के साथ बैश स्क्रिप्ट`… &&… `कमांड पर बंद नहीं होती है


14

मैं पहली त्रुटि पर बैश स्क्रिप्टset -e को रोकने के लिए उपयोग करता हूं ।

जब तक मैं कमांड का उपयोग नहीं करता, तब तक सब ठीक है &&:

$ cat script
set -e
cd not_existing_dir && echo 123
echo "I'm running! =P"
$
$ ./script
./script: line 2: cd: not_existing_dir: No such file or directory
I'm running! =P
$

के साथ तुलना:

$ cat script
set -e
cd not_existing_dir
echo "I'm running! =P"
$
$ ./script
./script: line 2: cd: not_existing_dir: No such file or directory
$

पहला उदाहरण अभी भी गूँजता है I'm running!, लेकिन दूसरा नहीं है। वे अलग व्यवहार क्यों करते हैं?

युपीडी। इसी तरह के सवाल: /programming/6930295/set-e-and-short-tests


आप पहले उदाहरण में क्या होने की उम्मीद करते हैं?
फ्लॉप

@Flup मैं असफल के बाद बंद करने के लिए स्क्रिप्ट उम्मीद cdआदेश
907

1
उन स्थानों की सामान्य चर्चा के लिए BashFAQ # 105 देखें जहां set -eव्यवहार आश्चर्यजनक है।
चार्ल्स डफी

जवाबों:


10

यह प्रलेखित व्यवहार है। बैश (1) आदमी पेज का कहना है के लिए set -e,

खोल से बाहर निकलें, तो आदेश है कि विफल रहता आदेश सूची का हिस्सा तुरंत एक निम्नलिखित है नहीं है whileया untilहै, तो निम्न परीक्षण का हिस्सा कीवर्ड ifया elifआरक्षित शब्द, एक में मार डाला किसी भी आदेश का हिस्सा &&या ||सूची आदेश को छोड़कर अंतिम निम्नलिखित &&या|| , किसी भी एक पाइप लाइन में कमांड लेकिन अंतिम, या यदि कमांड का रिटर्न मान इसके साथ उलटा हो रहा है !
[महत्व दिया।]

और POSIX शेल कमांड भाषा विनिर्देश पुष्टि करता है कि यह सही व्यवहार है:

-eसेटिंग जब यौगिक सूची को क्रियान्वित निम्नलिखित पर ध्यान नहीं दिया जाएगा while, until, if, या elifआरक्षित शब्द, एक पाइप लाइन के साथ शुरुआत !आरक्षित शब्द, या पिछले अलावा अन्य किसी AND-या सूची के किसी भी आदेश।

और धारा 2.9.3 सूचियाँ कि दस्तावेज़ परिभाषित करता है की

एंड-या लिस्ट ऑपरेटरों या " &&" और " ||" द्वारा अलग किए गए एक या अधिक पाइपलाइनों का एक क्रम है ।


9

set -eविकल्प कुछ स्थितियों में प्रभाव नहीं पड़ता है, और यह मानक व्यवहार और POSIX शिकायत खोल भर में पोर्टेबल है।


विफल कमांड पाइपलाइन का हिस्सा है:

false | true; echo printed

छप जाएगा printed

और केवल पाइपलाइन की विफलता ही मानी जाती है:

true | false; echo 'not printed'

कुछ नहीं छापेंगे।


निम्नलिखित यौगिक सूची में असफल आदेश रन while, until, if, elifआरक्षित शब्द, एक पाइप लाइन के साथ शुरुआत !आरक्षित शब्द, या के रूप में कोई भी आदेश &&या ||पिछले एक को छोड़कर सूची:

false || true; echo printed

अंतिम आदेश विफल रहता है फिर भी set -eप्रभावित होता है:

true && false; echo 'not printed'

किसी सम्‍मिलित कमांड में उपधारा विफल रहता है:

(false; echo 'not printed') | cat -; echo printed

धन्यवाद! यह उपयोग करने के लिए echo "printed"और echo "not_printed"आपके उदाहरणों (इसके बजाय echo 1) में स्पष्ट होगा ।
907 वीं

3
ध्यान दें कि set -eबाहर निकलने का कारण बनता है (false && true); echo not here, लेकिन { false && true; }; echo hereअलग-अलग शेल के साथ YMMV और एक ही शेल के विभिन्न संस्करणों के साथ नहीं। मैं set -eएक बजरा पोल के साथ स्पर्श नहीं करेगा और इसके बजाय उचित त्रुटि से निपटने में मदद करेगा।
स्टीफन चेज़लस

1

मेरा अनुमान है कि अगर-तब एक पूरे के रूप में सच करने के लिए शर्त है।

मैंने कोशिश की

set -e
if cd not_existing_dir
then  echo 123
fi
echo "I'm running! =P"

कौन देता है

-bash: cd: not_existing_dir: No such file or directory
I'm running! =P

यदि कोई शर्त है, तो त्रुटि कोड पकड़ा जाएगा, इस प्रकार बैश निष्पादन के अंत को ट्रिगर नहीं करेगा।


लेकिन मैं नहीं उपयोग करते हैंif ... fi
907

मुझे पता है, यह एक निहित है अगर।
अर्चेमार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.