2012-12-21 31 views
21

का उपयोग कर बैश में एक प्रोग्राम कॉल के लिए पर्यावरण चर सेट करना मैं env कमांड के माध्यम से एक संशोधित वातावरण के साथ एक शेल कमांड का आह्वान करने का प्रयास कर रहा हूं।एनवी

मैनुअल

env HELLO='Hello World' echo $HELLO 

के अनुसार Hello World गूंज चाहिए, लेकिन ऐसा नहीं है। अगर मैं

HELLO='Hello World' bash -c 'echo $HELLO' 

कर यह प्रिंट Hello World अपेक्षा के अनुरूप (इस जानकारी के लिए this answer करने के लिए धन्यवाद)।

मुझे यहां क्या याद आ रही है?

चीयर्स, निकलस

+0

कोई विस्तार के साथ एक सैनिटी चेक 'हैलो =' हैलो वर्ल्ड 'env | grep HELLO' जो अनुरोध किया जाता है लेकिन स्वीकार किए गए उत्तर से अभ्यास में बहुत कम उपयोगी है। –

उत्तर

37

ऐसा इसलिए है क्योंकि आपके पहले मामले में, आपका वर्तमान खोल कमांड चलाने से पहले $ HELLO चर का विस्तार करता है। और आपके वर्तमान खोल में कोई हैलो चर सेट नहीं है।

env HELLO='Hello World' echo $HELLO

यह कर देगा:

  • का विस्तार किसी भी चर को देखते हुए इस मामले में 3 तर्क 'नमस्ते = नमस्ते विश्व' के साथ नमस्कार $
  • रन env, 'गूंज' और ' '(एक खाली स्ट्रिंग, क्योंकि वर्तमान खोल में कोई हेल्लो वैरिएबल सेट नहीं है)
  • एनवी कमांड अपने पर्यावरण में HELLO =' हैलो वर्ल्ड 'चलाएगा और सेट करेगा
  • env चलाएगा तर्क '' (एक खाली स्ट्रिंग)

जैसा कि आप देखते हैं, वर्तमान खोल ने $ HELLO चर का विस्तार किया है, जो सेट नहीं है।

HELLO='Hello World' bash -c 'echo $HELLO'

यह कर देगा:

  • निम्न आदेश 2 तर्कों '-c' और 'गूंज $ हैलो'
  • साथ
  • रन बैश के बाद के लिए निर्धारित चर HELLO='Hello World अंतिम तर्क एकल उद्धरणों में संलग्न है, इसके अंदर कुछ भी विस्तारित नहीं किया गया है
  • बदले में नया बैश कमांडचलाएगा
  • नए बैश सब-शैल में $ HchoLO को इको करने के लिए, बैश पहले कुछ भी कर सकता है, इस मामले में $ HELLO, और पैरेंट खोल ने हमारे लिए "हैलो वर्ल्ड" सेट किया है।
  • subshell चलाता गूंज 'नमस्ते विश्व'

आप जैसे करने की कोशिश की तो इस:

env HELLO='Hello World' echo '$HELLO'

  • वर्तमान खोल कुछ भी यह कर सकते हैं, जो कुछ भी नहीं है के बाद से $ नमस्ते एकल उद्धरण में संलग्न है का विस्तार होगा
  • 3 तर्क 'नमस्ते = नमस्ते विश्व' के साथ
  • रन env, ' गूंज 'और' $ हैलो '
  • env आदेश चला और नमस्ते = सेट हो जाएगा' नमस्ते विश्व 'अपने वातावरण में
  • env तर्क के साथ गूंज चलेंगे' $ हैलो '

इस मामले में, कोई खोल नहीं है जो $ HELLO का विस्तार करेगा, इसलिए echo स्ट्रिंग $HELLO प्राप्त करता है और उसे प्रिंट करता है। परिवर्तनीय विस्तार केवल गोले द्वारा किया जाता है।

4

मुझे लगता है कि क्या होता है this situation जिसमें मैं भी हैरान था के समान है।

संक्षेप में, पहले मामले में परिवर्तनीय विस्तार वर्तमान खोल द्वारा किया जाता है जिसमें $HELLO नहीं है। दूसरे मामले में, हालांकि, एकल उद्धरण वर्तमान खोल को परिवर्तनीय विस्तार करने से रोकते हैं, इसलिए सब कुछ अपेक्षित काम करता है।

नोट कैसे दोहरे उद्धरण चिह्नों के लिए एकल उद्धरण बदलते जिस तरह से आप चाहते हैं काम करने से इस आदेश से बचाता है:

HELLO='Hello World' bash -c "echo $HELLO" 

अब यह आपके प्रश्न के पहले आदेश के रूप में ही कारण के लिए असफल रहने दिया जाएगा।

+0

सही। पहले मामले में, यह वर्तमान खोल है जो चर का विस्तार करता है। दूसरे मामले में, यह नया 'बाश' निष्पादित किया जा रहा है जो ऐसा करता है। –

+0

त्वरित उत्तर के लिए भी बहुत धन्यवाद! दुर्भाग्यवश मैं केवल एक जवाब दे सकता हूं एक अच्छा हरा टिक – Niklas

2

यह काम करता है और अच्छा है के लिए मुझे

$ MY_VAR='Hello' ANOTHER_VAR='World!!!' && echo "$MY_VAR $ANOTHER_VAR" 
Hello World!!! 
+1

मुझे नहीं लगता कि यह "एक प्रोग्राम कॉल के लिए" प्रश्न के हिस्से में है। यहां के वार्स मौजूदा सत्र के लिए सेट रहेंगे ताकि आप उन्हें गूंजना जारी रख सकें। –

0

यहाँ खोल अपेक्षा के अनुरूप काम कर रहा है पुष्टि करने के लिए एक आसान तरीका है।

env A=42 env 
env 

पहले आदेश रन 42 करने के लिए A सेट करता है और env चलाता है। दूसरा आदेश भी env चलाता है। दोनों के उत्पादन की तुलना करें।

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

  • कोई संबंधित समस्या नहीं^_^