आइए हम एक विशिष्ट उदाहरण पर विचार करें। grep
आदेश के लिए एक वातावरण चर कहा उपयोग करता GREP_OPTIONS
डिफ़ॉल्ट विकल्प सेट करने के लिए।
अभी। यह देखते हुए कि फ़ाइल test.txt
में निम्न पंक्तियाँ हैं:
line one
line two
कमांड चलाने से grep one test.txt
वापस आ जाएगी
line one
यदि आप -v
विकल्प के साथ grep चलाते हैं , तो यह गैर-मिलान लाइनों को लौटा देगा, इसलिए आउटपुट होगा
line two
अब हम पर्यावरण चर के साथ विकल्प सेट करने का प्रयास करेंगे।
export
आपके द्वारा कॉल किए जा रहे आदेशों के वातावरण में बिना सेट किए गए पर्यावरण चर विरासत में नहीं मिलेंगे।
GREP_OPTIONS='-v'
grep one test.txt
परिणाम:
line one
जाहिर है, विकल्प -v
पास नहीं हुआ grep
।
आप इस फॉर्म का उपयोग तब करना चाहते हैं जब आप केवल उपयोग करने के लिए शेल के लिए एक चर सेट कर रहे हैं, उदाहरण के लिए for i in * ; do
आप निर्यात नहीं करना चाहते हैं $i
।
हालांकि, चर को उस विशेष कमांड लाइन के वातावरण में पारित किया जाता है, इसलिए आप कर सकते हैं
GREP_OPTIONS='-v' grep one test.txt
जो अपेक्षित वापसी करेगा
line two
आप इस फॉर्म का उपयोग लॉन्च किए गए प्रोग्राम के इस विशेष उदाहरण के वातावरण को अस्थायी रूप से बदलने के लिए करते हैं।
चर निर्यात करने से चर विरासत में मिलता है:
export GREP_OPTIONS='-v'
grep one test.txt
अब लौटता है
line two
शेल में बाद में शुरू की गई प्रक्रियाओं के उपयोग के लिए चर सेट करने का यह सबसे आम तरीका है
यह सब हाशिये में किया गया था। export
बैश बिलिन है; VAR=whatever
बैश वाक्य रचना है। env
दूसरी ओर, अपने आप में एक कार्यक्रम है। जब env
कहा जाता है, निम्नलिखित बातें होती हैं:
- आदेश
env
को एक नई प्रक्रिया के रूप में निष्पादित किया जाता है
env
पर्यावरण को संशोधित करता है, और
- उस आदेश को कॉल करता है जिसे तर्क के रूप में प्रदान किया गया था।
env
प्रक्रिया की जगह command
प्रक्रिया।
उदाहरण:
env GREP_OPTIONS='-v' grep one test.txt
यह कमांड दो नई प्रक्रियाएं शुरू करेगी: (i) env और (ii) grep (वास्तव में, दूसरी प्रक्रिया पहले वाले को बदल देगी)। grep
प्रक्रिया के दृष्टिकोण से , परिणाम ठीक वैसा ही है जैसा चल रहा है
GREP_OPTIONS='-v' grep one test.txt
हालाँकि, आप इस मुहावरे का उपयोग कर सकते हैं यदि आप बैश से बाहर हैं या एक और शेल लॉन्च नहीं करना चाहते हैं (उदाहरण के लिए, जब आप कॉल के exec()
बजाय फ़ंक्शंस के परिवार का उपयोग कर रहे हैं system()
)।
पर अतिरिक्त ध्यान दें #!/usr/bin/env
यही कारण है कि मुहावरे #!/usr/bin/env interpreter
का उपयोग इसके बजाय किया जाता है #!/usr/bin/interpreter
। env
एक कार्यक्रम के लिए एक पूर्ण पथ की आवश्यकता नहीं है, क्योंकि यह execvp()
फ़ंक्शन का उपयोग करता है जो PATH
चर के माध्यम से खोजता है जैसे शेल करता है, और फिर कमांड रन द्वारा खुद को बदलता है। इस प्रकार, यह पता लगाने के लिए इस्तेमाल किया जा सकता है कि मार्ग पर एक दुभाषिया (जैसे पर्ल या अजगर) "बैठता है"।
इसका यह भी अर्थ है कि वर्तमान पथ को संशोधित करके आप प्रभावित कर सकते हैं कि किस अजगर संस्करण को कहा जाएगा। यह निम्नलिखित संभव बनाता है:
echo -e '#!/usr/bin/bash\n\necho I am an evil interpreter!' > python
chmod a+x ./python
export PATH=.
calibre
कैलिबर को लॉन्च करने के बजाय, परिणाम होगा
I am an evil interpreter!
export key=value
सिंटैक्स विस्तारित है और इसका उपयोग पोर्टेबल स्क्रिप्ट (यानी#! /bin/sh
) में नहीं किया जाना चाहिए ।