क्या यह जांचना संभव है कि-क्या बैश स्क्रिप्ट के भीतर सेट किया गया है?


9

यदि शेल फ़ंक्शन को काम करने के लिए -e / + ई की एक विशिष्ट सेटिंग की आवश्यकता होती है, तो क्या उस सेटिंग को स्थानीय रूप से सेट करना संभव है और फिर फ़ंक्शन से बाहर निकलने से पहले इसे अपनी पिछली सेटिंग में पुनर्स्थापित करना है?

myfunction()
{
   # Query here if -e is set and remember in a variable?
   # Or push the settings to then pop at the end of the function?
   set +e
   dosomething
   doanotherthing
   # Restore -e/+e as appropriate, don't just do unconditional   set -e
}

जवाबों:


12

आपके पास वर्तमान में चर में सेट किए गए झंडे हैं $-, इसलिए आप इसे फ़ंक्शन की शुरुआत में संरक्षित कर सकते हैं और इसके बाद इसे पुनर्स्थापित कर सकते हैं।

save=$-
...
if [[ $save =~ e ]]
then set -e
else set +e
fi

यह ध्यान दिया जाना चाहिए कि $-यह भी काम करता है /bin/shऔर आपको इसे पार्स करने के लिए शायद बशीशों की ज़रूरत नहीं है, बस उदाहरण के लिए ग्लोबिंग का उपयोग करें जो caseप्रदान करता है
जोसिफ रोडिन

2

तुम चर मूल्य के माध्यम से झंडा मूल्य पढ़ सकते हैं:

  > set +e 
  > echo $SHELLOPTS
    braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
  > set -e 
  > echo $SHELLOPTS
    braceexpand:emacs:errexit:hashall:histexpand:history:interactive-comments:monitor

आपको लगता है कि, सेटिंग के बाद देख set -e, मूल्य errexitमें $SHELLOPTSदिखाई देता है। आप वहां से इसकी जांच कर सकते हैं।

हालांकि, आप इस बिंदु को प्राप्त कर सकते हैं (यदि आप चाहें तो) निम्नलिखित बिंदु को याद करके: मैनुअल के अनुसार :

-e :

..... यह विकल्प शेल पर्यावरण और प्रत्येक उप-परिवेश पर्यावरण पर अलग से लागू होता है।

इस प्रकार, यदि आप अपने कार्य को एक उपधारा में निष्पादित करते हैं, जैसे

   zz="$(myfunction)"

आपको यह चिंता करने की आवश्यकता नहीं है कि errexitचर वातावरण में सेट किया गया है या नहीं, और आप इसे अपनी इच्छानुसार सेट कर सकते हैं।


धन्यवाद, जानकारी होना उपयोगी है। मुझे $ $ का पता चलता है - @meuh द्वारा सुझाया गया, हालांकि प्रोग्रामेटिक रूप से जांचना आसान है, इसीलिए मैंने उस उत्तर को स्वीकार कर लिया।
usta

उपखंडों के बारे में नोट उपयोगी है, लेकिन मैं कॉल साइटों को संशोधित करने से बचना चाहता था। अन्यथा मैं शायद myfunctionकॉल को myfunction || true-e के प्रभाव को दबाने के लिए कॉल बदल देता हूं और set +eपहले स्थान पर फ़ंक्शन के अंदर नहीं करना पड़ता है।
usta

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