"_ =" का अर्थ क्या है?


29

मैं चलाने के बाद set -a var=99, मैं के उत्पादन में एक वाक्य पा सकते हैं set:

...
TERM=xterm
UID=0
USER=root
VIRTUAL_ENV_DISABLE_PROMPT=1
_=var=99
colors=/etc/DIR_COLORS
...

क्या कोई मुझे बता सकता है कि "_ =" का क्या मतलब है?

मैं ध्यान देता हूं कि echo $varकुछ नहीं दूंगा। अगर मैं चलाता हूं set -a, तो setइस चर को फिर से शामिल नहीं करेगा। क्या हो रहा है?


जवाबों:


16

जब आप निष्पादित करते हैं set -a var=99, तो तीन अलग-अलग चीजें होती हैं (आपके प्रश्न से संबंधित):

  1. Vars निर्यात करने के लिए एक सेट विकल्प ( -a) (कर के विपरीत set +a)।
  2. स्थितिगत पैरामीटर विकल्प ( $1सेट टू var=99) का अनुसरण करने के लिए "सेट" हैं ।
  3. शेल चर अंडरस्कोर $_अंतिम पैरामीटर (विस्तारित) पर सेट है।

सेट-ए

सभी बाद के (नए या परिवर्तित) चर के निर्यात के रूप में (सभी गोले में, छोड़कर और कुछ संबंधित गोले) set -aनिशान का निष्पादन ।csh

$ set -a
$ myvariable=wer
$ env | grep myvariable
myvariable=wer

इस सेटिंग से पुनर्प्राप्त करने के लिए, बस -एक में बदलें +:

$ set +a
$ unset myvariable              # to erase it from the environment if it
                                # was exported before the change of set +a
$ myvariable=456544654          # A new value of the variable.
$ env | grep "variable"         # No output means the var does not exist
                                # in the current environment

सेट var = 99

जो वास्तव set -- var=99में एक विकल्प की व्याख्या से बचने के लिए होना चाहिए (और सेट में बहुत कुछ है) मानों के साथ जो एक डैश के साथ शुरू होता है (- ) से ।

तर्कों की सूची (स्थितीय मापदंडों की सूची) को उसके बाद सेट करता है --। यह सभी उचित गोले में मान्य है (csh et al में नहीं)। स्थिति संबंधी तर्क "$ @" (या समान "$ *", समान नहीं) के साथ मुद्रित होते हैं।

$ set -- a=1 b=2 c=3
$ echo "$@"
a=1 b=2 c=3

_ = Last_argument

और, आंतरिक शेल चर का मान _निष्पादित लाइन के अंतिम तर्क में बदल जाता है। यह लगभग सभी गोले (jsh, राख, यश, डैश, lksh, mksh, ksh93, attsh और बेशक csh और tcsh) के अलावा बाश के लिए सच नहीं है।

$ echo one two last argument
one two last argument

$ echo "$_"
argument

$ echo This is a new: last_argument
This is a new: last_argument

$ echo "$_"
last_argument

कृपया ध्यान दें कि $_विस्तार के बाद मूल्य है:

$ a="A New_Argument"
$ echo Something else to test: "$a"
Something else to test: A New_Argument

$ echo "$_"
A New_Argument

इसलिए जब आप निष्पादित करते हैं:

$ set -a myvar=99; set | grep 'myvar'
_=myvar=99

आपको शेल चर '$ _' का विवरण मिलता है। यह भी काम करता है:

$  set -a myvar=99; declare -p _
declare -- _="myvar=99"

37

अंडरस्कोर वास्तव में एक विशेष शेल चर है। आप यहां जो देख रहे हैं, वह _एक मान के साथ अंडरस्कोर ( ) चर है var=99। यह आसानी से, और खोल द्वारा बनाए रखा है। यह है:

  • शेल स्टार्टअप पर सेट करें, जिसमें शेल या स्क्रिप्ट का निरपेक्ष फ़ाइल नाम है जिसे तर्क सूची में पारित किया गया है।
  • उसके बाद, यह विस्तार के बाद पिछले कमांड के अंतिम तर्क तक फैलता है।
  • मेल की जाँच करते समय, यह पैरामीटर मेल फ़ाइल का नाम रखता है।
  • यह प्रत्येक कमांड के पूर्ण पथनामे पर भी सेट किया गया है जो उस कमांड को निर्यात किए गए वातावरण में रखा गया है।

आपका उदाहरण दूसरी श्रेणी में आता है। आपने टाइप किया:

set -a var=99  

अंतिम तर्क तो वहाँ था var=99, और कहा कि था मूल्य आप की स्थापना कर रहे थे (आप की स्थापना नहीं कर रहे थे varकरने के लिए 99)। इसलिए, _यह निर्धारित किया गया था। और जो बताया जा रहा है:

_=var=99  

यह थोड़ा भ्रामक है, लेकिन पहले =चर को असाइन करने का संकेत देता है _, और दूसरा मूल्य का हिस्सा है।

यह भी ध्यान देने योग्य है कि -aविकल्प निर्यात होने के बाद सभी परिभाषित चर का setकारण होगा ।


16

सही उत्तर आपके द्वारा उपयोग किए जा रहे शेल पर निर्भर करेगा:

  • के लिए bash, जो कुछ भी @ याकूब ने कहा कि लागू होता है
  • के लिए zsh, यह केवल पिछले कमांड के अंतिम तर्क और कमांड के वातावरण में कमांड के पूर्ण पथनाम पर सेट है
  • कुछ गोले जैसे dashकेवल एक इंटरैक्टिव सत्र चलाने पर इस चर को सेट करते हैं

अन्य गोले में भी अन्य विशिष्टताएं हो सकती हैं। जैसे, $_है परिभाषित नहीं POSIX में है, इसलिए एक संभावित पोर्टेबिलिटी मुद्दों के बारे में पता है जब इसे का उपयोग किया जाना चाहिए।

साइड नोट: यदि आपका इरादा 99 के मूल्य को असाइन करना है varऔर इसे बाद के उपप्रोसेस के वातावरण में उपलब्ध कराना है, तो इसे प्राप्त करने के लिए सही सिंटैक्स है:

export var=99

2
एक सही सिंटैक्स भी है unset var;set -a; var=99। सभी गूंजने योग्य गोले में काम करता है (csh et al नहीं)।
तीर

1
@ एरो हालांकि बॉब एगर के जवाब की अंतिम पंक्ति के अनुसार यह सब बना देगा बाद में चर को सेट / संशोधित कर निर्यात करेगा, जो कि आप नहीं चाहते।
ट्रिपहाउंड जूल

8

और मैं ध्यान echo $varदेता हूं कि कुछ भी नहीं दिया जाएगा। … क्या हुआ?

बैश (1) के नॉट -फाइन प्रिंट में , हम पाते हैं

set[ --abefhkmnptuvxBCEHPT] [ विकल्प-नाम ] [ arg …]-o
set   [ +abefhkmnptuvxBCEHPT] [ विकल्प-नाम ] [ arg+o …]

            Shell
    जब विकल्प निर्दिष्ट किए जाते हैं, तो वे शेल विशेषताओं को सेट या अनसेट करते हैं। विकल्प प्रसंस्करण के बाद शेष किसी भी तर्क के क्रम में, स्थितीय पैरामीटर के लिए मान के रूप में इलाज कर रहे हैं और आवंटित कर रहे हैं, $1, $2, ... ।$n

जिसका अर्थ है, set -a var=99पर्यावरण चर varको सेट नहीं करना 99; यह $1करने के लिए सेट करता हैvar=99 । कोशिश करो echo "$1"या echo "$*"आप देखेंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.