2016-12-07 4 views
7

कृपया ध्यान दें: इस साइट पर एक एकल शैल चर का परीक्षण करने के तरीके के बारे में कई प्रश्न हैं। यह प्रश्न किसी भी अपरिभाषित चर के लिए एक स्क्रिप्ट का परीक्षण करने के बारे में है।मैं बैश उपचार अपरिभाषित चर को त्रुटियों के रूप में कैसे बना सकता हूं?

आप निष्पादन में किसी भी त्रुटि देखे बिना बैश में एक अपरिभाषित चर का उपयोग कर सकते हैं:

#!/bin/bash 

echo ${UNDEF_FILE} 
ls -l ${UNDEF_FILE} 

exit 0 

मैं इस बहुत त्रुटियों की संभावना मिल गया है। अगर मैं एक बड़े स्क्रिप्ट में एक चर का नाम बदलना चाहता हूं, या उस चर को हटा देना चाहता हूं, तो पिछले सभी पुराने संदर्भ स्क्रिप्ट में त्रुटियों का कारण बनेंगे। कभी-कभी डीबग करने के लिए यह स्पष्ट नहीं होता है या जब आप बहुत देर हो जाते हैं तो आपको पता चलता है।

इसकी अनुमति क्यों है? अपरिभाषित चर को ध्वजांकित करने का कोई तरीका है?

+0

"क्यों" 1 9 70 के युग के गोले के साथ संगतता पर वापस जाते हैं। यदि आप इतिहास के विरोध में, सर्वोत्तम जांच के बारे में परवाह करते हैं, तो स्थिर जांच - http://shellcheck.net/ के साथ, जो डाउनलोड के लिए भी उपलब्ध है [एक स्टैंडअलोन टूल के रूप में] (https://github.com/koalaman/शेलचेक) - आपका दोस्त यहाँ है। –

+1

स्पष्ट रूप से, अपरिभाषित चर के विस्तार को गलत बनाने से कई आम मुहावरे टूट जाएंगे। '[[$ var]] और {echo" $ var के साथ कुछ करना "; }, उदाहरण के लिए, 'set -u' के साथ तोड़ देगा:' सेट-ए 'के विपरीत (जो केवल विफलताओं को बनाता है जिन्हें विफल नहीं किया जाता है या असफलताओं में सशर्त के रूप में उपयोग नहीं किया जाता है),' set -u' * प्रत्येक * संदर्भ बनाता है एक अपरिभाषित चर एक त्रुटि। –

+0

(वैसे - ऑल-कैप्स वैरिएबल नाम, पीओएसआईक्स द्वारा परिभाषित अंतरिक्ष में हैं, जो कि शैल या ऑपरेटिंग सिस्टम के अर्थ के साथ पर्यावरण चर के लिए हैं; कम से कम एक लोअर-केस कैरेक्टर वाले वेरिएबल्स का नामस्थान एप्लिकेशन उपयोग के लिए आरक्षित है। यह लागू होता है सभी शैल वैरिएबलों के लिए, केवल पर्यावरण परिवर्तनीय के विपरीत, एक शैल वैरिएबल को स्थापित करने के कारण बाद में पर्यावरण परिवर्तनीय ओवरराइटिंग के साथ नाम साझा किया जाता है)। –

उत्तर

9

आप उपयोग कर सकते हैं:

set -u 

अपनी स्क्रिप्ट के शुरू में जब अपरिभाषित चर का उपयोग कर एक त्रुटि फेंकने के लिए।

-u

उपचार को सेट किए बिना चर और मानकों को विशेष मानकों "@" और जब पैरामीटर विस्तार प्रदर्शन "*" एक त्रुटि के रूप में अन्य की तुलना में। यदि एक अनसेट चर या पैरामीटर पर विस्तार का प्रयास किया जाता है, तो खोल एक त्रुटि संदेश प्रिंट करता है, और यदि इंटरैक्टिव नहीं है, तो गैर-शून्य स्थिति से बाहर निकलता है।

+3

... हालांकि, यह इंगित करने लायक है कि इसकी उपयोगिता ... विवादास्पद है: कई सामान्य मुहावरे एक शून्य स्ट्रिंग में विस्तारित अपरिभाषित मानों पर निर्भर करते हैं, इसलिए कोड को 'set -u' संगतता के लिए स्पष्ट रूप से लिखा जाना चाहिए ऐसा होना चाहता है। –

+2

'set -o nounset' का अर्थ' set -u' (Bash में) जैसा ही है, और कुछ लोग इसे पसंद करते हैं। – pjh

+1

देखें [टेस्ट-यू 'या' सेट-यू 'का उपयोग करते हुए सामान्य समस्याओं को संभालने के तरीकों के लिए "set -o nounset"] (http://stackoverflow.com/q/7832080/4154375) का उपयोग करते समय एक चर सेट में सेट किया गया है या नहीं। 'सेट -ओ संज्ञासेट''। – pjh

0

set -u अधिक सामान्य विकल्प है, लेकिन जैसा कि अन्य उत्तर 'टिप्पणी में बताया, वहाँ खेलने में set -u साथ मुहावरेदार शेल स्क्रिप्ट लिख समस्याएं हैं। एक विकल्प पैरामीटर विस्तार बनाने के लिए है जो एक विशिष्ट चर सेट नहीं होने पर त्रुटि उत्पन्न करता है।

$ echo $foo 

$ echo $? 
0 
$ echo "${foo?:no foo for yoo}" 
bash: foo: :no foo for yoo 
$ echo $? 
1 

यह त्रुटि एक गैर-सहभागी खोल से बाहर निकलने के कारण होगा। यह आपको एक त्रुटि स्थिति की गारंटी देने का एक त्वरित तरीका प्रदान करता है जो नियंत्रण प्रवाह को एक अपरिभाषित मान के साथ जारी रखने की अनुमति नहीं देगा। The spec को बाहर निकलने के लिए एक इंटरैक्टिव खोल की आवश्यकता नहीं है, हालांकि यह ध्यान देने योग्य है कि एक इंटरैक्टिव शैल में भी, यदि कोई त्रुटि किसी फ़ंक्शन में होती है तो बैश फ़ंक्शन कॉल से वापस आ जाएगा।

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