बैश शेल का पर्यावरण चर `_` कब है?


10

बैश मैनुअल कहते हैं (मैनपेज, मेरा जोर):

जब बैश एक बाहरी कमांड को आमंत्रित करता है, तो चर कमांड $_के पूर्ण पथनाम पर सेट हो जाता है और अपने वातावरण में उस कमांड पर जाता है।

और ( विशेष पैरामीटर ):

_

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

  1. बैश शेल में, मैं दौड़ता हूं:

    $ bash
    $ export | grep '_=' 

    मैनुअल के अनुसार, _नए बैश शेल का एक पर्यावरण चर होना चाहिए। exportनए बैश शेल के सभी पर्यावरण चर का उत्पादन करने वाला है, लेकिन यह आउटपुट नहीं करता है _। तो मुझे आश्चर्य है कि क्या _नए बैश शेल का एक पर्यावरण चर है?

  2. वास्तव में किसी भी बैश शेल में, वही होता है

    $ export | grep '_='

    कुछ भी आउटपुट नहीं करता है। तो मुझे आश्चर्य होता _है कि क्या कभी बैश शेल का एक पर्यावरण चर है?

  3. तुलना के लिए:

    $ dash
    $ export  | grep '_='        
    export _='/bin/dash'

मेरी पोस्ट माइक की टिप्पणी और स्टीफन के जवाब से प्रेरित है ।


1
यह एक शेल वैरिएबल है, और यह कमांड के वातावरण में चला गया है; यह आवश्यक रूप से शेल के पर्यावरण को निर्यात नहीं किया जाता है। exportएक बिलिन है, लेकिन यदि आप उपयोग करते हैं printenv _, तो यह आपको दिखाएगा कि यह कैसे लागू किया गया था: /usr/bin/printenvइस प्रणाली पर।
टॉबी स्पाइट

ध्यान दें कि bash -c export | grep _=(बैश से), यह दिखाएगा कि माता-पिता ने bashकमांड को कैसे लागू किया है , भले ही $_माता-पिता में परेशान हों।
टोबी स्पाइट

यह भी देखें unix.stackexchange.com/questions/293302
JdeBP

जवाबों:


13

हां, _नए बैश शेल का एक पर्यावरण चर है; आप दौड़ कर देख सकते हैं

tr '\0' '\n' < /proc/$$/environ | grep _=

शेल के अंदर: यह शेल के प्रारंभिक वातावरण की सामग्री को दर्शाता है। आप इसे पहले शेल में नहीं देखेंगे क्योंकि शुरू होने से पहले इसे सेट करने के लिए कोई पिछला शेल नहीं था।

$_बैश के अंदर का विस्तार _विशेष पैरामीटर को संदर्भित करता है , जो पिछले कमांड के अंतिम तर्क तक फैलता है। (आंतरिक रूप से बैश इसे _शेल वेरिएबल का उपयोग करके संभालता है , जिसे हर बार एक कमांड पार्स किए जाने पर अपडेट किया जाता है, लेकिन यह एक कार्यान्वयन डिटेल है। यह "अनएक्सपोर्टेड" है जब भी कमांड को पार्स किया जाता है। ) क्योंकि यह exportप्रदर्शित नहीं होता है _ एक चर जो निर्यात के रूप में चिह्नित है; हालाँकि आप इसे आउटपुट में देख सकते हैं set

पहले उदाहरण में, नया बैश शेल अपने स्टार्टअप फ़ाइलों में आदेशों को निष्पादित और निष्पादित करता है, इसलिए जब चल रहा है explore | grep '-=', _पहले से ही ओवरराइट किया गया है और निर्यात नहीं किया गया है।

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


धन्यवाद। नए बैश शेल में, export | grep '_='कुछ भी आउटपुट क्यों नहीं करता है ? मूल बैश शेल में, tr '\0' '\n' < /proc/$$/environ | grep _=कुछ भी आउटपुट क्यों नहीं करता है ?
टिम


9

exportतर्कों के बिना सभी निर्यात किए गए चर को सूचीबद्ध करता है_एक चर नहीं है, लेकिन एक विशेष पैरामीटर के रूप में सूचीबद्ध है ।

कुछ विशेष मापदंडों के नामों के विपरीत , थोड़ा भ्रमित करने वाला, एक चर का एक वैध नाम_ भी होगा । कम से कम बैश 4.4 इसे बिना किसी शिकायत के असाइनमेंट की अनुमति देता है। यह सिर्फ उपयोगी नहीं है क्योंकि विशेष प्रभाव मूल्य को तुरंत ओवरराइड करता है।


2
मज़ा _एक चर के रूप में उपयोग करने की कोशिश कर रहे हैं ; ;-)। यह प्रभावी रूप से केवल-लेखन है और मूल्य तुरंत खो जाता है।
स्टीफन किट

1
इसके अलावा, आंतरिक रूप से बैश _एक चर के रूप में व्यवहार करता है , यही वजह है कि यह आउटपुट में दिखाई देता है set। हालाँकि यह जहाँ तक मैं निर्धारित कर सकता हूँ निर्यात नहीं किया जा सकता है।
स्टीफन किट

2
@StephenKitt, लेकिन बैश 4.4 इसे केवल-पढ़ने के लिए चिह्नित करने की अनुमति देता है। या एक पूर्णांक। कुछ उल्लसित परिणामों के साथ।
ilkachachu

1
हा, अच्छा लग रहा है, यह मनोरंजक है!
स्टीफन किट

5

के रूप में आप के उत्पादन में देख सकते हैं के रूप में हर खोल चर निर्यात के रूप में चिह्नित नहीं है declare -p

इसे निर्यात के रूप में bashचिह्नित करने का कोई मतलब नहीं है $_क्योंकि यह स्वचालित रूप से इस चर को बाल प्रक्रियाओं के वातावरण में जोड़ता है लेकिन शेल (उस पल में) के मुकाबले एक अलग मूल्य के साथ।

इसे निर्यात के रूप में दिखाना उपयोगकर्ता को केवल इस बारे में भ्रमित करेगा कि बाहरी आदेशों के वातावरण के साथ क्या होने वाला है।

सभी "रनटाइम चर" BASH*निर्यात नहीं किए जाते हैं।

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