पर्यावरण चर सेट करने के लिए मैं उपसर्ग के रूप में चर का उपयोग क्यों नहीं कर सकता?


11

आम तौर पर, यह उपसर्ग लगाकर एक कमांड के लिए एक पर्यावरण चर सेट करना संभव है:

hello=hi bash -c 'echo $hello'

मुझे यह भी पता है कि हम एक चर का उपयोग कमांड कमांड के किसी भी भाग को निम्न की तरह करने के लिए कर सकते हैं:

$ cmd=bash
$ $cmd -c "echo hi" # equivalent to bash -c "echo hi"

मुझे यह जानकर बहुत आश्चर्य हुआ कि आप पर्यावरण चर सेट करने के लिए एक कमांड को उपसर्ग करने के लिए एक चर का उपयोग नहीं कर सकते हैं। परीक्षण का मामला:

$ prefix=hello=hi
$ echo $prefix # prints hello=hi
$ $prefix bash -c 'echo $hello'
hello=hi: command not found

मैं एक चर का उपयोग करके पर्यावरण चर को क्यों सेट नहीं कर सकता हूं? क्या उपसर्ग भाग एक विशेष भाग है? मैं सामने वाले ईवैल का उपयोग करके इसे प्राप्त करने में सक्षम था, लेकिन मुझे अभी भी समझ नहीं आया कि क्यों। मैं bash 4.4 का उपयोग कर रहा हूं।


1
आप envइसके बजाय उपयोग कर सकते हैं eval, जो IIRC अधिक सुरक्षित है, लेकिन धीमा है।
wjandrea

जवाबों:


14

मुझे संदेह है कि यह उस क्रम का हिस्सा है जो आपको पकड़ रहा है:

वे शब्द जो परिवर्तनशील कार्य या पुनर्निर्देशन नहीं हैं, विस्तारित हैं (शैल विस्तार देखें)। यदि विस्तार के बाद कोई भी शब्द बना रहता है, तो पहले शब्द को कमांड का नाम दिया जाता है और शेष शब्द तर्क होते हैं

यह साधारण कमांड विस्तार पर अनुभाग में बैश संदर्भ मैनुअल से है।

में cmd=bashउदाहरण के लिए, कोई वातावरण चर सेट कर रहे हैं, और बैश पैरामीटर विस्तार के माध्यम से कमांड लाइन अप को संसाधित करता है, छोड़ने bash -c "echo hi"

में prefix=hello=hiउदाहरण के लिए, वहाँ फिर पहले पास में कोई चर असाइनमेंट, तो प्रसंस्करण, पैरामीटर विस्तार करने के लिए जारी की एक पहला शब्द है, जिसके परिणामस्वरूप कर रहे हैं hello=hi

एक बार चर असाइनमेंट संसाधित हो जाने के बाद, उन्हें कमांड निष्पादन के दौरान फिर से संसाधित नहीं किया जाता है।

के तहत प्रसंस्करण और इसके परिणाम देखें set -x:

$ prefix=hello=hi
+ prefix=hello=hi
$ $prefix bash -c 'echo $hello'
+ hello=hi bash -c 'echo $hello'
-bash: hello=hi: command not found
$ hello=42 bash -c 'echo $hello'
+ hello=42
+ bash -c 'echo $hello'
42

"चर विस्तार" के सुरक्षित रूप के लिए -as- "पर्यावरण चर" की तुलना में eval, वेजेंड्रिया के सुझाव परenv विचार करें :

prefix=hello=hi
env "$prefix" bash -c 'echo "$hello"'
hi

यह कमांड-लाइन वेरिएबल असाइनमेंट की सख्ती से नहीं है, क्योंकि हम envयूटिलिटी वेरिएबल्स को कमांड में एनवायरनमेंट वेरिएबल के मुख्य फंक्शन का उपयोग कर रहे हैं , लेकिन यह उसी लक्ष्य को पूरा करता है। $prefixचर कमांड लाइन की प्रक्रिया के दौरान का विस्तार होता है, नाम = करने के लिए मूल्य प्राप्त हो रहा envहै, यह किसे साथ गुजरता है bash


3
इसी तरह, $foo=bar bash -c ...काम नहीं करेगा, क्योंकि $foo=barएक चर असाइनमेंट (जो भी मूल्य हो $foo) नहीं है, क्योंकि चर असाइनमेंट के लिए पैटर्न $foo=barफिट नहीं है name=value
मुरु

3

क्योंकि $prefixअसाइनमेंट नहीं है। @ जेफ में अब स्पष्टीकरण है

आप इसके बजाय एक फ़ंक्शन के साथ एक समान काम कर सकते हैं:

$ prefix() { hello=hi "$@"; }
$ prefix bash -c 'echo "$hello"'
hi

... और आप चाहें तो उन्हें स्टैक भी कर सकते हैं:

$ foo() { foo=123 "$@"; }
$ bar() { bar=456 "$@"; }
$ foo bar bash -c 'echo "$bar $foo"'
456 123
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.