जब पैटर्न नहीं मिला तो शेल स्क्रिप्ट से समय से पहले निकलने से रोकने के लिए `सेट -e` और` grep` मुहावरा


15

आवश्यक मदद - एक GNU / LINUX बैश पर शेल स्क्रिप्टिंग के संदर्भ में:

मैं हमेशा उपयोग करता हूं set -e। अक्सर, मैं grepचाहता हूं कि स्क्रिप्ट को निष्पादन को समाप्त करने के लिए हमेशा नहीं करना चाहिए अगर संकेत पैटर्न grepका एक निकास स्थिति 1नहीं मिली है।

इस समस्या को हल करने के लिए मैंने जो प्रयास किए हैं, वे इस प्रकार हैं:

(I प्रयास करें)
अगर set +o pipefailकुछ के साथ grep आह्वान करें और grep 'p' | wc -lतब तक वांछित व्यवहार प्राप्त करें, जब तक कि भविष्य का अनुचर सक्षम न हो जाए pipefail। इसके अलावा, मुझे सक्षम करना पसंद है pipefailइसलिए यह मेरे लिए काम नहीं करता है।

(II आज़माएं) मिलान पैटर्न के परीक्षण के लिए
एक sedया awkकेवल प्रिंट लाइनों से मेल खाते पैटर्न का उपयोग करें , फिर wcमिलान की गई रेखाएं। मैं इस विकल्प को पसंद नहीं है क्योंकि का उपयोग कर sedके लिए grepमेरा सच्चा समस्या के लिए एक समाधान की तरह लगता है।

(III का प्रयास करें)
यह मेरी सबसे कम पसंदीदा है - कुछ इस तरह:set +e; grep 'p'; set-e

किसी भी अंतर्दृष्टि / मुहावरों की सबसे अधिक सराहना की जाएगी - धन्यवाद।

जवाबों:


19

आप एक ifशर्त में grep डाल सकते हैं, या यदि आप बाहर निकलने की स्थिति के बारे में परवाह नहीं करते हैं, तो जोड़ें || true

उदाहरण: grepखोल को मारता है

$ bash
$ set -e
$ echo $$
33913
$ grep foo /etc/motd
$ echo $$
9233

समाधान 1: गैर-शून्य निकास स्थिति को फेंक दें

$ bash
$ set -e
$ echo $$
34074
$ grep foo /etc/motd || true
$ echo $$
34074

समाधान 2: स्पष्ट रूप से बाहर निकलने की स्थिति का परीक्षण करें

$ if ! grep foo /etc/motd; then echo not found; fi
not found
$ echo $$
34074

चर्चा करने वाले पेज मैन पेज से set -e:

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


यह देखते हुए कि लंबे समय तक बैश लागू नहीं हुआ-सही ढंग से, यह हो सकता है कि प्रलेखन अभी तक सही नहीं है। जैसा कि टेक्स्ट बैश-3.x मैन पेज के साथ समान प्रतीत होता है, कृपया ध्यान दें: bash4.0 को लागू करने से पहले सभी bash संस्करणों ने गलत तरीके से लागू किया।
स्किल

यह भी ध्यान दें कि जैसे ही POSIX मानक गलत था, हमने 2009 में -E के साथ त्रुटि से निपटने के लिए POSIX पाठ को बदल दिया
schily

1
@schily कृपया पॉइंटर्स को यह बताएं कि किसी को यह पता चल सकता है कि -E का 'सही' व्यवहार क्या है, bash <4 ने अलग तरीके से क्या किया, और POSIX में क्या बदला गया।
zwol

बैश -3 में कीड़े मूल रूप से इसके लिए बेकार हैं make क्योंकि यह हमेशा त्रुटियों पर बाहर नहीं निकलता था। संबंधित POSIX विचार-विमर्श के लिए, आप की जांच करना चाहते हो सकता है austingroupbugs.net
schily

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