पर्यावरण चर में एकल और दोहरे उद्धरण का क्या महत्व है?


19

मैंने अपनी तरह के कुछ पर्यावरण चर को परिभाषित किया है।

MY_HOME="/home/my_user"

लेकिन चर का मूल्यांकन तब तक नहीं लगता है जब तक कि मैं उद्धरणों को छीन नहीं लेता और फ़ाइल को पुन: स्रोत नहीं करता। मेरा मानना ​​है कि यदि रिक्त स्थान हैं तो उद्धरण आवश्यक हैं, और यदि वांछित नहीं हैं तो एकल उद्धरण का उपयोग किया जाता है। क्या कोई परिवर्तनीय परिभाषा में एकल और दोहरे उद्धरण के महत्व को स्पष्ट कर सकता है? सामने-टिक और बैक-टिक के बारे में कैसे?

जवाबों:


23

मुझे लगता है कि आप शब्दावली के बारे में भ्रमित हैं।

एक "एनवायरनमेंट वेरिएबल" केवल एक शेल वैरिएबल है जो किसी भी बच्चे की प्रक्रिया को विरासत में मिलेगा।

आप अपने उदाहरण में जो कर रहे हैं वह एक शेल चर बना रहा है। यह पर्यावरण में नहीं है जब तक आप इसे निर्यात नहीं करते हैं:

MY_HOME="/home/my_user"
export MY_HOME

लगभग सभी गोले (csh, tsh को छोड़कर) में "MY_HOME" नाम का एक चर डालता है।

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

V='some substrings grouped together'  # assignment
X="Put $V to make a longer string"    # substitution and then assignment
Y=`date`                              # run command, assign its output
Z='Put $V to make a longer string'    # no substition, simple assignment

जब तक आप इसे निर्यात नहीं करते तब तक पर्यावरण में कुछ भी नहीं है।


18

शैल चर बनाम पर्यावरण चर

MY_HOME="/home/my_user"सेट खोल चर बुलाया MY_HOME। शैल प्रोग्रामिंग भाषाएं हैं, और इनमें चर (जिन्हें पैरामीटर भी कहा जाता है) हैं। इस असाइनमेंट के बाद, आप चर के मान का उपयोग कर सकते हैं, जैसे कि echo "$MY_HOME"

शेल चर एक आंतरिक शेल अवधारणा है। जब वह शेल आवृत्ति समाप्त हो जाती है, MY_HOMEतो भूल जाती है। प्रत्येक कार्यक्रम के बारे में जो जानता है और अपने बच्चों को प्रसारित करता है वह पर्यावरण चर है

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

export MY_HOME="/home/my_user"

अधिक विवरण आप पहले पढ़ने पर छोड़ सकते हैं

शेल चर स्वचालित रूप से पर्यावरण चर नहीं बनने का कारण आंशिक रूप से यह है कि एक स्क्रिप्ट गलती से एक चर नाम का उपयोग कर सकती है जो उस प्रोग्राम के लिए सार्थक है जो इसे लॉन्च करता है, और आंशिक रूप से सिर्फ ऐतिहासिक है।

कुछ बहुत पुराने गोले exportहर बार इस्तेमाल किए जाने के लिए आवश्यक होते हैं जब आप एक चर नाम बदल देते हैं, लेकिन सभी आधुनिक गोले पर्यावरण चर के लिए असाइनमेंट का ट्रैक रखते हैं, ताकि निम्नलिखित स्निपेट गूँज हो bar:

myvar=foo
export myvar
myvar=bar
env | grep '^myvar='

इसके अलावा, कुछ बहुत पुराने गोले के लिए अलग आदेशों की आवश्यकता myvar=fooऔर export myvarहै, लेकिन सभी आधुनिक गोले को समझने export myvar=foo

आप set -aसभी शेल वैरिएबल असाइनमेंट बनाने के लिए स्वचालित रूप से वेरिएबल एक्सपोर्ट कर सकते हैं, इसलिए यदि आप पहले उस शेल में भागते हैं तो myvar=fooयह बराबर है ।export myvar=fooset -a

उद्धृत करने पर

कोटेशन ज्यादातर ऑर्थोगोनल है। यदि आप वैरिएबल को असाइन कर रहे हैं, तो ऐसा कोई वर्ण नहीं है जो शेल के लिए विशेष है, तो आपको किसी भी उद्धरण की आवश्यकता नहीं है। यदि विशेष वर्ण हैं, तो आपको उन्हें एकल उद्धरण या दोहरे उद्धरण या बैकस्लैश या उसके संयोजन के साथ सुरक्षित करने की आवश्यकता है। यह सादे myvar=valueवाक्यविन्यास और exportउपयोगिता दोनों के लिए जाता है ।

असाइनमेंट सिंटैक्स और सिंटैक्स के बीच एक अंतर है export। शेल $fooआगे चर प्रतिस्थापन के परिणामों को विस्तार देता है , प्रदर्शन क्षेत्र (शब्द) विभाजन और pathname विस्तार (ग्लोबिंग) । इसका मतलब है कि यदि मान myvarहै hello ​ *, तो वर्तमान निर्देशिका में फ़ाइलों की सूची के बाद एक एकल स्थान के बाद echo $myvarप्रिंट helloहोता है। यह लगभग कभी वांछनीय नहीं है, इसलिए सामान्य सिद्धांत हमेशा चर प्रतिस्थापन के आसपास दोहरे उद्धरण चिह्नों का उपयोग करता है (जब तक कि आपको पता नहीं है कि आपको pathname विस्तार या क्षेत्र विभाजन की आवश्यकता है) echo "$myvar":। एक साधारण असाइनमेंट के मामले में, othervar=$myvarवास्तव में मज़बूती से मूल्य को कॉपी करता myvarहैothervar, क्योंकि ग्लोबिंग और वर्ड स्प्लिटिंग असाइनमेंट्स में हिचकते हैं (क्योंकि वे कई शब्द बनाते हैं, लेकिन एक ही शब्द अपेक्षित होता है)। exportहालाँकि यह वितरण लागू नहीं होता है । इसलिए यदि आप एक सरल नियम को याद रखना चाहते हैं, तो बस चर प्रतिस्थापन के आसपास दोहरे उद्धरण चिह्नों का उपयोग करें।


क्या आप कृपया समझा सकते हैं "उद्धरण ज्यादातर ऑर्थोगोनल है।" "उद्धृत करने पर" अनुभाग में? मुझे उस वाक्य में ऑर्थोगोनल का अर्थ नहीं मिलता है ।
डीके बोस

1
@DKBose इसका मतलब है कि एक तरफ पर्यावरण बनाम शेल चर, और दूसरी ओर उद्धृत, दो अलग-अलग मुद्दे हैं जिनका एक दूसरे के साथ बहुत कम संबंध है। विक्षनरी 4 और 5 का अर्थ है
गिल्स एसओ- बुराई को रोकना '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.