2016-10-14 17 views
12

मैं बस पर्यावरण चर को कैसे सेट कर सकता हूं?पर्यावरण चर को प्रिंट/गूंज कैसे करें?

NAME=sam echo "$NAME" # empty 

आप यहां देख सकते हैं eval यह काम करता है। यह कोई तरीका है क्या?

NAME=sam eval 'echo $NAME' # => sam 
+2

'NAME = sam echo जो भी 'खोल' में 'NAME' के मान को नहीं बदलता है। – rici

उत्तर

16

ये जाने की जरूरत के रूप में विभिन्न आदेशों जैसे:

NAME=sam; echo "$NAME" 
NAME=sam && echo "$NAME" 

विस्तार $NAME रिक्त स्ट्रिंग पर, खोल पहले, द्वारा किया जाता है echo चलाने से पहले इतना समय NAME चर को पारित कर दिया है echo कमांड का पर्यावरण, विस्तार पहले ही किया जा चुका है (शून्य स्ट्रिंग के लिए)।

एक आदेश में एक ही परिणाम प्राप्त करने के लिए:

NAME=sam printenv NAME 
+0

मैंने 'printenv' के बारे में एक नोट जोड़ा। उम्मीद है कि यह ठीक है, @heemayl –

+0

@AaronMcDaid धन्यवाद, अनावश्यक 'env' हटा दिया गया है। – heemayl

+1

ध्यान दें कि केवल 'printenv'-based कमांड ओपी के कमांड के अर्थशास्त्र को संरक्षित करता है:' NAME' को _command-scoped environment variable_ के रूप में परिभाषित करता है, जो केवल कमांड कमांड और उसके बच्चे की प्रक्रियाओं को देखते हैं, लेकिन बाद के शेल कमांड नहीं देखते हैं। अन्य आदेश कुछ बहुत अलग करते हैं: वे 'NAME' को _until-the-current-shell-exits shell-only variable_ के रूप में परिभाषित करते हैं, जो बाद में _shell_ कमांड देखते हैं, लेकिन _no बाहरी utilities_ नहीं। – mklement0

2

यह भी काम करता है, सेमी-कोलन के साथ।

NAME=sam; echo $NAME

2

वाक्य रचना

variable=value command 

अक्सर एक विशिष्ट प्रक्रिया के लिए एक वातावरण चर सेट करने के लिए प्रयोग किया जाता है। हालांकि, आपको समझना होगा कि कौन सी प्रक्रिया को चरम हो जाता है और कौन इसका अर्थ देता है। उदाहरण के तौर पर, दो गोले का उपयोग करके:

a=5 
# variable expansion by the current shell: 
a=3 bash -c "echo $a" 
# variable expansion by the second shell: 
a=3 bash -c 'echo $a' 

परिणाम पहली गूंज के लिए 5 और दूसरे के लिए 3 होगा।

2

एक महत्वपूर्ण स्पष्टीकरण के साथ मौजूदा जवाब को एक साथ लाने के लिए:

के रूप में कहा गया है, NAME=sam echo "$NAME" साथ समस्या यह है कि $NAME काम NAME=sam प्रभावी होता है से पहले वर्तमान खोल से विस्तार हो जाता है।

समाधान है कि मूल अर्थ विज्ञान ((अप्रभावी) समाधान का प्रयास NAME=sam echo "$NAME" की) की रक्षा:

उपयोग या तो eval[1] , या printenv (के रूप में द्वारा जोड़ा (सवाल अपने आप में के रूप में) हारून McDaid heemayl's answer करने के लिए), या bash -c (Ljm Dullaart's answer से), दक्षता के अवरोही क्रम में:

NAME=sam eval 'echo "$NAME"' # use `eval` only if you fully control the command string 
NAME=sam printenv NAME 
NAME=sam bash -c 'echo "$NAME"' 

printenv एक पॉज़िक्स उपयोगिता नहीं है, लेकिन यह लिनक्स और मैकोज़/बीएसडी दोनों पर उपलब्ध है।

क्या मंगलाचरण की इस शैली (<var>=<name> cmd ...) करता है NAME परिभाषित करने के लिए है:

  • एक पर्यावरण चर
  • कि है केवल आदेश के लिए परिभाषित के रूप में लागू किया जा रहा

दूसरे शब्दों में: NAME केवल आदेश के लिए मौजूद है लागू किया जा रहा है, और वर्तमान खोल पर कोई प्रभाव नहीं है (यदि कोई चर NAME नामित से पहले से ही अस्तित्व में है, के बाद कोई नहीं होगा, एक पहले से मौजूद NAME चर अवशेष नहीं बदला गया)।

POSIX Command Search and Execution अध्याय में इस प्रकार के आमंत्रण के नियमों को परिभाषित करता है।


निम्न समाधानों (heemayl's answer से) बहुत अलग तरह से काम:

NAME=sam; echo "$NAME" 
NAME=sam && echo "$NAME" 

जबकि वे एक ही उत्पादन उत्पादन, वे बजाय निर्धारित करें:

  • एक खोल परिवर्तनीय NAME (केवल) के बजाय एक पर्यावरण चर
    • अगर echo एक आदेश है कि पर्यावरण चर NAME पर भरोसा किया है, तो वह (पहले से या संभावित परिभाषित अलग ढंग से) में परिभाषित किया जाएगा नहीं किया जा।
  • कि आदेश के बाद पर रहता है।

ध्यान दें कि हर वातावरण चर भी एक खोल चर के रूप में सामने आ रहा है, लेकिन उलटा सच नहीं है: खोल चर केवल वर्तमान खोल और उसके subshells के लिए दिखाई दे रहे हैं, लेकिन नहीं बच्चे प्रक्रियाओं के लिए, इस तरह के रूप बाहरी उपयोगिताओं और (गैर-सोर्स) स्क्रिप्ट (जब तक उन्हें export या declare -x के साथ पर्यावरण चर के रूप में चिह्नित नहीं किया जाता है)।


[1] तकनीकी तौर पर, bash POSIX यहाँ के उल्लंघन में है (के रूप में zsh): एक विशेष खोल में निर्मित, पूर्ववर्ती NAME=sam काम चर $NAME कारण चाहिए रहने के लिए के बाद से eval है कमांड खत्म होने के बाद दायरे में, लेकिन ऐसा नहीं होता है।
हालांकि, जब आप POSIX संगतता मोड में bash चलाते हैं, तो यह अनुपालन करता है।
dash और ksh हमेशा अनुपालनशील होते हैं।
सटीक नियम जटिल हैं, और कुछ पहलुओं को लागू करने के लिए कार्यान्वयन के लिए छोड़ दिया गया है; फिर, Command Search and Execution देखें।

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