समस्या, पुनरीक्षित
स्पष्ट रूप से, इस बिंदु पर मैनुअल भ्रमित है। जीएनयू बैश मैनुअल का कहना है:
किसी भी साधारण कमांड या फंक्शन के लिए पर्यावरण [ध्यान दें कि यह बिलिंस को बाहर करता है] इसे शेल पैरामीटर में वर्णित के रूप में पैरामीटर असाइनमेंट के साथ प्रीफ़िक्स करके अस्थायी रूप से संवर्धित किया जा सकता है। ये असाइनमेंट स्टेटमेंट केवल उस कमांड द्वारा देखे गए पर्यावरण को प्रभावित करते हैं।
यदि आप वास्तव में वाक्य को पार्स करते हैं, तो यह क्या कह रहा है कि कमांड / फ़ंक्शन के लिए वातावरण संशोधित किया गया है, लेकिन मूल प्रक्रिया के लिए वातावरण नहीं। तो, यह काम करेगा:
$ TESTVAR=bbb env | fgrep TESTVAR
TESTVAR=bbb
क्योंकि env कमांड का वातावरण निष्पादित होने से पहले संशोधित किया गया है। हालांकि, यह काम नहीं करेगा:
$ set -x; TESTVAR=bbb echo aaa $TESTVAR ccc
+ TESTVAR=bbb
+ echo aaa ccc
aaa ccc
जब पैरामीटर विस्तार शेल द्वारा किया जाता है।
दुभाषिया कदम
समस्या का एक और हिस्सा यह है कि बैश अपने दुभाषिया के लिए इन चरणों को परिभाषित करता है :
- एक फ़ाइल (शेल लिपियों को देखें) से इसके इनपुट को पढ़ता है, एक स्ट्रिंग से एक तर्क के रूप में आपूर्ति की जाती है -c मंगलाचरण विकल्प (इनवॉइस बैश देखें), या उपयोगकर्ता के टर्मिनल से।
- कोटिंग में वर्णित उद्धरण नियमों का पालन करते हुए, शब्दों और ऑपरेटरों में इनपुट को तोड़ता है। इन टोकन को मेटाचैटर्स द्वारा अलग किया जाता है। इस कदम से एलियास का विस्तार होता है (एलियासेस देखें)।
- टोकन को सरल और यौगिक कमांड में देखें (शेल कमांड देखें)।
- विभिन्न शेल विस्तार (शैल विस्तार देखें) को करता है, विस्तारित टोकन को फाइलनाम की सूची में तोड़ता है (फाइलनाम विस्तार देखें) और आदेश और तर्क।
- कोई आवश्यक पुनर्निर्देशन करता है (पुनर्निर्देशन देखें) और पुनर्निर्देशन ऑपरेटरों और उनके ऑपरेटरों को तर्क सूची से निकाल देता है।
- आदेश निष्पादित करता है (निष्पादन कमांड देखें)।
- वैकल्पिक रूप से कमांड के पूरा होने की प्रतीक्षा करता है और अपनी निकास स्थिति को एकत्रित करता है (एक्ज़िट स्थिति देखें)।
यहाँ क्या हो रहा है कि बिल्डरों को अपना निष्पादन वातावरण नहीं मिलता है, इसलिए वे कभी भी संशोधित वातावरण नहीं देखते हैं। इसके अलावा, सरल कमांड (जैसे / बिन / प्रतिध्वनि) को एक संशोधित एनीवेंशन मिलता है (इसीलिए env उदाहरण ने काम किया है) लेकिन शेल का विस्तार मौजूदा वातावरण में चरण # 4 में हो रहा है।
दूसरे शब्दों में, आप 'aaa $ TESTVAR ccc' को / bin / echo में पास नहीं कर रहे हैं; आप प्रक्षेपित स्ट्रिंग (वर्तमान परिवेश में विस्तारित) / बिन / प्रतिध्वनि में पास कर रहे हैं। इस स्थिति में, चूंकि वर्तमान परिवेश में कोई TESTVAR नहीं है , इसलिए आप केवल कमांड में ' aa ccc' पास कर रहे हैं।
सारांश
प्रलेखन बहुत स्पष्ट हो सकता है। अच्छी बात यह है कि ढेर अतिप्रवाह है!
यह सभी देखें
http://www.gnu.org/software/bash/manual/bashref.html#Command-Execution-Environment