2012-11-21 8 views
6

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

हालांकि, तीसरे पक्ष के पुस्तकालयों में से कुछ (जिनके पास मेरे पास स्रोत बदलने की क्षमता है) ऐसा नहीं करते हैं, और वे के साथ मौजूद चर परीक्षणों को बदलने में खुश नहीं हैं।

उन में लिपियों को निष्पादित नहीं किया जा सकता है। तो मैं इनमें से कुछ में क्या करना चाहता हूं, विकल्पों का एक अधिक अनुमोदित सेट सेट करें, और फिर कठोर को पुनर्स्थापित करें। के बाद से सवाल में स्क्रिप्ट बहुत से उपयोगकर्ताओं को, जिनमें से कुछ भी एक ही समस्या का सामना करना पड़ा द्वारा उपयोग किया जाता है, मैं तीसरे पक्ष के स्क्रिप्ट में इस परिवर्तन डाल करना चाहते हैं अर्थात्:

<preserve original options> 
set +e +u +o pipefail 
#do stuff like 
if [ -n "$_UNSET_VAR" ] ; then 
    cp <some stuff> <some other stuff> 
fi 
<restore original options (whatever they were)> 

मैं की रक्षा करने के तरीके के लिए देख रहा हूँ और इन मूलों को बहाल करें।

उत्तर

7

विशेष पैरामीटर $- में वर्तमान में सेट किए गए विकल्पों की एक सूची है। आप यह देखने के लिए पार्स कर सकते हैं कि -e और -u सेट हैं या नहीं। pipefail के लिए, आपको shopt के आउटपुट को पार्स करना होगा।

यदि आप अपने कोड को सबहेल में चला सकते हैं (आप वैश्विक चर सेट करने की कोशिश नहीं कर रहे हैं), तो ऐसा करना आसान हो सकता है और मूल स्थिति को रीसेट करने के बारे में चिंता न करें।

(
    set +e +u +o pipefail 
    if [ -n "$_UNSET_VAR" ]; then 
     cp <some stuff> <some other stuff> 
    fi 
) 
+0

उत्कृष्ट। यह काम करता है - https://github.com/dannystaple/virtualenv/commit/a220ed9cca154cff5a04caf957f619dd61d1e15b। –

संबंधित मुद्दे

 संबंधित मुद्दे