मैं बस पर्यावरण चर को कैसे सेट कर सकता हूं?पर्यावरण चर को प्रिंट/गूंज कैसे करें?
NAME=sam echo "$NAME" # empty
आप यहां देख सकते हैं eval
यह काम करता है। यह कोई तरीका है क्या?
NAME=sam eval 'echo $NAME' # => sam
मैं बस पर्यावरण चर को कैसे सेट कर सकता हूं?पर्यावरण चर को प्रिंट/गूंज कैसे करें?
NAME=sam echo "$NAME" # empty
आप यहां देख सकते हैं eval
यह काम करता है। यह कोई तरीका है क्या?
NAME=sam eval 'echo $NAME' # => sam
ये जाने की जरूरत के रूप में विभिन्न आदेशों जैसे:
NAME=sam; echo "$NAME"
NAME=sam && echo "$NAME"
विस्तार $NAME
रिक्त स्ट्रिंग पर, खोल पहले, द्वारा किया जाता है echo
चलाने से पहले इतना समय NAME
चर को पारित कर दिया है echo
कमांड का पर्यावरण, विस्तार पहले ही किया जा चुका है (शून्य स्ट्रिंग के लिए)।
एक आदेश में एक ही परिणाम प्राप्त करने के लिए:
NAME=sam printenv NAME
मैंने 'printenv' के बारे में एक नोट जोड़ा। उम्मीद है कि यह ठीक है, @heemayl –
@AaronMcDaid धन्यवाद, अनावश्यक 'env' हटा दिया गया है। – heemayl
ध्यान दें कि केवल 'printenv'-based कमांड ओपी के कमांड के अर्थशास्त्र को संरक्षित करता है:' NAME' को _command-scoped environment variable_ के रूप में परिभाषित करता है, जो केवल कमांड कमांड और उसके बच्चे की प्रक्रियाओं को देखते हैं, लेकिन बाद के शेल कमांड नहीं देखते हैं। अन्य आदेश कुछ बहुत अलग करते हैं: वे 'NAME' को _until-the-current-shell-exits shell-only variable_ के रूप में परिभाषित करते हैं, जो बाद में _shell_ कमांड देखते हैं, लेकिन _no बाहरी utilities_ नहीं। – mklement0
यह भी काम करता है, सेमी-कोलन के साथ।
NAME=sam; echo $NAME
वाक्य रचना
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 होगा।
एक महत्वपूर्ण स्पष्टीकरण के साथ मौजूदा जवाब को एक साथ लाने के लिए:
के रूप में कहा गया है, 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 देखें।
'NAME = sam echo जो भी 'खोल' में 'NAME' के मान को नहीं बदलता है। – rici