केवल स्क्रिप्ट की अवधि के लिए एक पर्यावरण चर कैसे सेट करें?


127

लिनक्स में (उबंटू 11.04) बैश में, क्या अस्थायी रूप से एक पर्यावरण चर सेट करना संभव है जो केवल स्क्रिप्ट की अवधि के लिए सामान्य चर से अलग होगा? उदाहरण के लिए, एक शेल स्क्रिप्ट में, एक ऐप बनाना जो होम पोर्टेबल को वर्तमान कार्य निर्देशिका में फ़ोल्डर में अस्थायी रूप से सेट करके और फिर ऐप लॉन्च करके होम पोर्टेबल को बचाता है।


5
यह कठिन होगा यदि आप स्क्रिप्ट की अवधि से परे स्थापित करना चाहते हैं
निमो

जवाबों:


119
VAR1=value1 VAR2=value2 myScript args ...

2
मैंने इसे चलाने के लिए कई बार खुद किया है vblank_mode=0 glxgears। यह काम करता है, लेकिन यह vblank_mode=0: command not foundदौड़ने के बाद भी कहता है , जबकि प्रीपेड करने का envकारण यह नहीं है। [परीक्षण ...] जाहिर है zsh इसे पसंद नहीं करता है (अभी भी इसे सही ढंग से उपयोग करता है), लेकिन बैश इसके साथ ठीक है। मुझे लगता है कि मैं envअब से विधि के साथ जाऊँगा ।
चिनोटो वोक्रो

2
स्क्रिप्ट के साथ यह काम करता है लेकिन कैसे के बारे VAR1="hello" echo $VAR1में कुछ भी वापस नहीं करता है?
जिब्री

2
@ ज़िब्री यह तब है जब विस्तार हो रहा है। संभवतः आप ऐसा कुछ कर सकते हैं:VAR1="hello" bash -c 'echo $VAR1'
साइबरबरिंड

यह दिखाने के लिए कि यह कई पर्यावरण चर के लिए भी संभव है।
बिनरूस

70
env VAR=value myScript args ...

18
याVAR=value myScript args ...
रॉकलाइट

9
1. PATH=$PATH:XYZ echo $PATH | grep XYZहालांकि कैसे कोई उत्पादन नहीं आया है? 2. उपयोग न करने और न करने के बीच क्या अंतर है env?
qubodup

18
क्योंकि ईको कमांड को निष्पादित करने से पहले शेल पाथ चर का विस्तार करता है । आपको उस विस्तार में देरी करने की आवश्यकता है। एक तरीका: PATH=$PATH:XYZ sh -c 'echo $PATH' | grep XYZ- एकल उद्धरण यहाँ प्रमुख हैं
ग्लेन जैकमैन

14
इसका उपयोग करने envऔर न करने के बीच क्या अंतर है?
मोहम्मद नौरेलिन

यह एक oneliner में काम करने के लिए प्रकट नहीं होता है जैसेIFS=$'\n' for l in lines; do ... done
drevicko

31

रख दो

export HOME=/blah/whatever

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


11
यह भ्रामक है। exportसबस्क्रिप्शन को वेरिएबल पास करेगा, लेकिन यह पैरेंट शेल को नियंत्रित नहीं करता है। यदि आप एक ऐसी स्क्रिप्ट लिख रहे हैं, जो "#! / Bin / sh" या पसंद से शुरू होती है, तो आपके द्वारा निर्धारित कोई भी चर स्क्रिप्ट से बाहर निकलते ही गायब हो जाएगा।
ब्राइटलैंसर

1
@brightlancer, यह सच है लेकिन मेरे द्वारा लिखी गई किसी भी बात का खंडन नहीं करता। (इस संभावना के अपवाद के साथ कि स्क्रिप्ट एक पृष्ठभूमि प्रक्रिया शुरू कर सकती है, लेकिन मुझे लगता है कि यह ओपी के परिष्कार के स्तर से परे है और केवल भ्रमित करेगा)।
हमखोलम ने मोनिका

5
निर्यात अनावश्यक है। साथ ही, आपका उत्तर केवल तभी काम करता है जब उसकी स्क्रिप्ट एक दुभाषिया (#! / Bin / sh या like) को आमंत्रित करती है। यदि उसकी "स्क्रिप्ट" नहीं है, तो आपने जो उसे बताया था, वह उसकी स्क्रिप्ट के अंत से परे रहेगा। इसलिए मैंने कहा कि आपका उत्तर भ्रामक था - यह सही हो सकता है, यह नहीं हो सकता है, लेकिन यह निश्चित रूप से एक हिस्सा है जो अनावश्यक और भ्रमित है क्योंकि यह किसी को यह सोचने का कारण बन सकता है कि "निर्यात" वह आवश्यक तत्व है जिसकी उसे तलाश थी।
ब्राइटलैंसर

7
@brightlancer: निर्यात आवश्यक है यदि OP की स्क्रिप्ट उप-स्क्रिप्ट को आमंत्रित करती है जो स्वयं $ HOME पर निर्भर करती है, और मैंने यह नहीं मानने का साहस किया कि ऐसा नहीं था। इसके अलावा, बैश एक स्क्रिप्ट को चलाने के लिए एक उपधारा को स्पॉन करेगा भले ही स्क्रिप्ट में कोई शेबंग रेखा न हो लेकिन निष्पादन बिट सेट के साथ सिर्फ एक पाठ फ़ाइल है। इसे आज़माएँ - स्क्रिप्ट में परिवर्तनशील असाइनमेंट उस शेल में दिखाई नहीं देते हैं जिसे आप इसे इनवोक करते हैं। यह केवल तभी होगा जब आप sourceस्क्रिप्ट को स्पष्ट रूप से बताएंगे कि यह उसी शेल द्वारा निष्पादित किया जाएगा जिसे आप कमांड टाइप करते हैं।
हमाखोल ने मोनिका

4
@brightlancer: निर्यात आवश्यक है यदि वह $HOMEस्क्रिप्ट से निष्पादित किसी भी आदेश द्वारा विरासत में प्राप्त करना चाहता है। और अगर वह नहीं करता है, और की सेटिंग $HOMEकेवल स्क्रिप्ट के लाभ के लिए है, तो वह संभवतः स्क्रिप्ट को संशोधित करने से बेहतर होगा, इसलिए यह कुछ और को संदर्भित करता है $HOME
कीथ थॉम्पसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.