"निर्यात var = मान" कहां उपलब्ध नहीं है?


31

मैंने 1990 के दशक के मध्य में यूज़नेट पर - शायद निर्माण - उठाया है

export var=value

एक बशीवाद है, और यह कि पोर्टेबल अभिव्यक्ति है

var=value
export var

मैं वर्षों से इसकी वकालत कर रहा हूं, लेकिन हाल ही में, किसी ने मुझे इसके बारे में चुनौती दी, और मुझे वास्तव में कोई भी दस्तावेज नहीं मिला, जो मेरा एक ठोस विश्वास हुआ करता था।

के लिए Googling "export: command not found"किसी भी मामले को लाने के लिए नहीं लगता है जहां किसी को वास्तव में यह समस्या थी, इसलिए भले ही यह वास्तविक हो, मुझे लगता है कि यह बहुत आम नहीं है।

(हिट मैं newbies जो कॉपी / पेस्ट किया विराम चिह्न, और साथ समाप्त हो गया होने लगते हैं 'export: command not foundया कुछ इस तरह, या उपयोग करने की कोशिश exportके साथ sudo, और नौसिखिया csh। उन बॉर्न शैल सिंटैक्स का उपयोग करने की कोशिश कर)

मैं निश्चित रूप से बता सकता हूं कि यह ओएस एक्स पर काम करता है, और विभिन्न लिनक्स डिस्ट्रोस पर, जहां shयह है , सहित dash

sh$ export var=value
sh$ echo "$var"
value
sh$ sh -c 'echo "$var"'  # see that it really is exported
value

आज की दुनिया में, क्या यह कहना सुरक्षित है कि export var=valueउपयोग करना सुरक्षित है?

मैं समझना चाहता हूं कि परिणाम क्या हैं। यदि यह v7 "बॉर्न क्लासिक" के लिए पोर्टेबल नहीं है, तो यह शायद ही सामान्य से अधिक है। यदि ऐसी उत्पादन प्रणालियाँ हैं जहाँ शेल वास्तव में इस सिंटैक्स के साथ सामना नहीं कर सकता है, तो यह जानना उपयोगी होगा।


2
धन्यवाद आखिरकार मुझे समझ में आया कि मैं इतनी बार क्यों देखता हूं कि मुझे लगा कि यह बेकार है: var = value; निर्यात var
Thorsten Staerk

2
अभी भी कुछ सोलारिस बक्से चारों ओर लात मार रहे हैं, और वे अपने मानक उपकरण में कुख्यात हैं; स्पेक्ट्रम के दूसरे छोर पर, busyboxअपने स्वयं के न्यूनतम शेल के साथ नहीं आता है? (मैं इस दूसरे को सही करने की कोशिश करने की स्थिति में नहीं हूं।)
उलरिच श्वार्ज़

धन्यवाद उलरिच, सोलारिस अच्छी तरह से अपराधी हो सकता है कि यह लंबा वाक्यविन्यास अभी भी क्यों है।
थोरस्टेन स्टैक

जवाबों:


20
export foo=bar

बॉर्न शेल (70 के दशक का एक पुराना शेल जिसमें से shराख / बाश / ksh / यश / zsh व्युत्पन्न जैसे आधुनिक कार्यान्वयन) का समर्थन नहीं किया गया था । द्वारा पेश किया गया था ksh

बॉर्न शेल में, आप ऐसा करेंगे:

foo=bar export foo

या:

foo=bar; export foo

या साथ set -k:

export foo foo=bar

अब, का व्यवहार:

export foo=bar

शेल से शेल में बदलता रहता है।

समस्या यह है कि असाइनमेंट और सरल कमांड तर्क अलग-अलग तरीके से पार्स और व्याख्या किए जाते हैं।

foo=barऊपर एक काम (कभी कभी) के रूप में एक आदेश तर्क के रूप में कुछ गोले से और दूसरों के द्वारा स्वीकार किया गया।

उदाहरण के लिए,

a='b c'
export d=$a

इसकी व्याख्या इस प्रकार है:

'export' 'd=b' 'c'

कुछ गोले के साथ ( ash, पुराने संस्करणों में zsh(sh emulation में), yash) और:

'export' 'd=b c'

दूसरों में ( bash; ksh)।

जबकि

export \d=$a

या

var=d
export $var=$a

सभी गोले ( 'export' 'd=b' 'c'अस) में एक ही व्याख्या की जाएगी क्योंकि बैकस्लैश या डॉलर चिन्ह उन गोले को रोकते हैं जो असाइनमेंट के रूप में उन तर्कों पर विचार करने के लिए इसका समर्थन करते हैं।

यदि exportखुद को उद्धृत किया गया है या शेल के आधार पर कुछ विस्तार (यहां तक ​​कि भाग में) का परिणाम है, तो यह विशेष उपचार प्राप्त करना भी बंद कर देगा।

उस पर अधिक विवरण के लिए " क्या स्थानीय चर असाइनमेंट के लिए उद्धरण आवश्यक हैं? "

बॉर्न सिंटैक्स हालांकि:

d=$a; export d

अस्पष्टता के बिना सभी गोले द्वारा एक ही व्याख्या की जाती है ( d=$a export dबॉर्न शेल और पोसिक्स अनुरूप गोले में भी काम करेगा लेकिन अनुकरण zshमें जब तक कि हाल के संस्करणों में नहीं sh)।

यह इससे बहुत खराब हो सकता है। उदाहरण के लिए देखें कि हाल ही में चर्चाbash जब सरणियाँ शामिल हैं।

(IMO, यह उस सुविधा को पेश करने की गलती थी )।


मुझे आश्चर्य हुआ कि अर्धविराम की आवश्यकता नहीं है foo=bar export foo, क्योंकि मैंने इसे हमेशा देखा था। मुझे पता है कि निर्यात एक बिलिन है, लेकिन इससे foo=bar; foo=baz export foo; echo $fooअलग व्यवहार क्यों करता है foo=bar; foo=baz /bin/cat /dev/null; echo $foo?
jrw32982

3
@ jrw32982, क्योंकि यह एक बिलिन है। तुम अब भी मिलता है कि आधुनिक POSIX गोले में लेकिन केवल के लिए विशेष builtins जो exportहै।
स्टीफन चेज़लस

यद्यपि यह चर्चा करता है declare, नहीं export, मैं सलाह देता हूं कि जो कोई भी सुरक्षा के बारे में परवाह करता है वह उस लिंक पर चर्चा को पढ़ता है जो स्टीफनचेज़ेलस ने बैश.बग्स को प्रदान किया था
जॉन 1024

बहुत बढ़िया जवाब! लेकिन इसे प्राप्त करने d=$a export dमें एक लंबा समय लगा, सभी गोले की अस्पष्टता के बिना एक ही व्याख्या की जाती है ;-)
Cony

@conny, d=$a export dअब और काम नहीं करता है zsh, इसलिए मैंने जवाब अपडेट कर दिया है। संपादित देखें।
स्टीफन चेज़लस

28

यह बशीवाद नहीं बल्कि पोसिक्स कंप्लीट सिंटैक्स है। यह वास्तव में काफी पहले एक क्षिस्म के रूप में शुरू हुआ था और बाद में लगभग सभी बॉर्न सिंटैक्स आधारित गोले द्वारा अपनाया गया था। एकमात्र कुख्यात अपवाद /bin/shसोलारिस 10 और पुराने पर है जो विरासत बोर्न शेल सिंटैक्स से चिपक जाता है। उम्मीद है, Solaris 11 एक POSIX अनुरूप शेल का उपयोग करता है /bin/sh

वैसे, exportपहले से ही विरासत बॉर्न शेल में एक अंतर्निहित आदेश export: command not foundथा इसलिए गुमराह करना भ्रामक था।

यहाँ एक विरासत बोर्न शेल व्यवहार है जब exportएक प्रभाव के साथ संयुक्त है:

$ export var=22
var=22: is not an identifier

उदासीनता के लिए, इस मूल बॉर्न शेल का स्रोत कोड उपलब्ध है और इसे अधिकांश यूनिक्स और लिनक्स वितरणों के लिए संकलित किया जा सकता है।


ऐतिहासिक अंतर्दृष्टि और Google के लिए सही त्रुटि संदेश के लिए बहुत धन्यवाद! रेट्रोस्पेक्ट, ब्लश में स्पष्ट ...
ट्रिपल

4
यह मूल बॉर्न शेल का स्रोत कोड नहीं है, यह एक संशोधित ओपनसोलारिस श है। यह बोर्न शेल है लेकिन विकास के दशकों से गुजरने के बाद। मूल बॉर्न शेल, जैसा कि यूनिक्स वी 7 के साथ भेजा गया है, यूनिक्स हेरिटेज सोसाइटी में
स्टीफन चेज़लस

1
@ स्टीफनचेज़ेलस सख्ती से बोल रहे हैं, आप हमेशा की तरह सही हैं। ध्यान दें कि मैंने "मूल बॉर्न शेल" नहीं लिखा था, लेकिन "यह मूल बॉर्न शेल" था क्योंकि मैं सोलारिस 10 द्वारा उपयोग किए गए शेल और इसके स्रोत कोड का उल्लेख कर रहा था जिसे आधुनिक प्लेटफार्मों पर संकलित किया जा सकता है। यह भी ध्यान दें कि बॉर्न शेल में 1977 और 1989 के बीच कई विशेषताएं थीं, लेकिन फिर अनिवार्य रूप से पिछले 25 वर्षों में (नए प्लेटफॉर्म और बग फिक्स के लिए पोर्टिंग / एडाप्टिंग के बाहर) विकसित होना बंद हो गया।
22 अगस्त को जलीगरे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.