टीएल; डीआर: के मामले में export FOO=bar, बैश अपनी अस्थायी पर्यावरण निर्माण को आमंत्रित करता है, FOO=barउस वातावरण में सेट करता है, फिर एक अंतिम कमांड देता है export FOO। उस बिंदु पर, FOOअंतिम तर्क के रूप में लिया जाता है।
आह, बहुत गाली दी $_:
($ _, एक अंडरस्कोर।) शेल स्टार्टअप पर, शेल या शेल स्क्रिप्ट को लागू करने के लिए उपयोग किए जाने वाले पूर्ण पथनाम पर सेट किया जाता है जिसे पर्यावरण या तर्क सूची में पारित किया गया है। इसके बाद, विस्तार के बाद पिछले तर्क के अंतिम तर्क तक फैलता है। साथ ही निष्पादित किए गए प्रत्येक कमांड को लागू करने के लिए उपयोग किए गए पूर्ण पथनाम पर सेट है और उस कमांड को निर्यात किए गए वातावरण में रखा गया है। मेल की जाँच करते समय, यह पैरामीटर मेल फ़ाइल का नाम रखता है।
आइए कुछ बदलाव देखें:
$ man; echo $_
What manual page do you want?
man
$ man foo; echo $_
No manual entry for foo
foo
$ echo; echo $_
echo
$ echo bar foo; echo $_
bar foo
foo
$ foo=x eval 'echo $foo'; echo $_
x
echo $foo
$ bar() { man $1; }; echo $_
foo
$ for (( i=0; $i<0; i=i+1 )); do echo $i; done; echo $_
foo
$ bar; echo $_
What manual page do you want?
man
$ bar foo; echo $_
No manual entry for foo
foo
$ MANPATH=/tmp; echo $_
$ export MANPATH=/tmp; echo $_
MANPATH
इसलिए हम यहां तीन पैटर्न देखते हैं:
- कमांड सिस्टम, फ़ंक्शंस, और बिल्ट-इन से आम तौर पर अपेक्षित व्यवहार किया जाता है:
$_यदि कोई तर्क नहीं है, तो कमांड नाम पर ही सेट किया जाता है।
- फ़ंक्शन परिभाषाओं के बाद, लूप और अन्य तार्किक निर्माण:
$_संशोधित नहीं है।
- बाकी सब कुछ:
$_काफी अपेक्षित नहीं है; अजीब।
मैंने अजीबता में कुछ अंतर्दृष्टि प्रदान करने के लिए कोड लिख दिया है।
$ ./bash --noprofile --norc -c 'man foo'
lastword=[man]
lastarg=[foo]
$ ./bash --noprofile --norc -c 'export FOO=bar'
lastword=[export]
lastarg=[FOO=bar]
bind_variable, name=[FOO], value=[bar]
before bind_lastarg, lastarg=[FOO]
bind_lastarg, arg=[FOO]
bind_variable, name=[_], value=[FOO]
$ ./bash --noprofile --norc -c 'declare FOO=bar'
lastword=[declare]
lastarg=[FOO=bar]
bind_variable, name=[FOO], value=[(null)]
before bind_lastarg, lastarg=[FOO=bar]
bind_lastarg, arg=[FOO=bar]
bind_variable, name=[_], value=[FOO=bar]
आप देख सकते हैं कि पार्सरlastarg= सभी मामलों में अपेक्षित अंतिम तर्क ( ) देखता है , लेकिन उसके बाद जो होता है वह इस बात पर निर्भर करता है कि बैश के बारे में क्या सोचना चाहिए। Execute_cmd.c, execute_simple_command () देखें ।
के मामले में export FOO=bar, बैश असाइनमेंट बनाता है और फिर चर निर्यात करता है। यह दस्तावेज़ीकरण के दावे के अनुरूप है जो अंतिम तर्क की गणना विस्तार के बाद की गई है।
EDITORनिर्यात करने का एक तर्क है