पर्यावरण चर में बश को भी पार्स / रन सामान क्यों करता है?


9

ShellShock बैश में बग वातावरण चर के माध्यम से काम करता है। ईमानदारी से मुझे इस तथ्य से आश्चर्य हुआ कि इस तरह की विशेषता है:

"env vars के माध्यम से फंक्शन्स की परिभाषाएँ पास करना"

इसलिए यह सवाल जबकि शायद पूरी तरह से तैयार नहीं है, उदाहरण के लिए पूछना है या एक ऐसा मामला जिसमें यह सुविधा होना आवश्यक है?

बक्शीश। क्या अन्य गोले zsh, डैश आदि में भी हैं?


यह फंक्शन परिभाषाओं को पारित करने के लिए एनवी वर्जन का उपयोग करता है। आपका क्या मतलब है "यह केवल पर्यावरण चर को उपलब्ध / सुलभ क्यों नहीं रखता है?" ?
एंथन

@Aththon टिप्पणी के लिए धन्यवाद। शायद मुझे स्पष्ट और स्पष्ट होना चाहिए। एनवी वर्जन के माध्यम से फ़ंक्शन परिभाषाओं पर पास करने में सक्षम होना किस कारण से आवश्यक है?
मानवतावादी

1
मुझे 100% यकीन नहीं है, लेकिन मुझे लगता है कि उदाहरण के लिए, यह है कि GNU parallelफ़ंक्शन परिभाषाएँ वितरित अगर यह कई मार उदाहरणों को आमंत्रित करता है। यदि उस तरीके से नहीं है, तो इसे उन लोगों को एक फाइल में लिखना होगा, जो प्रत्येक इनवॉइस इंस्टेंस में पढ़ता है और फिर आपको उन समस्याओं से निपटना होगा जैसे कि उस फाइल को हटाया जा सकता है।
एंथन

2
इस धागे का कुछ इतिहास है। निर्यात किए गए फ़ंक्शंस, हालांकि, पागल हैं । यदि आप पुराने शेल के निष्पादन योग्य आदेशों को प्राप्त करने के लिए एक नया शेल चाहते हैं तो आप .dotउसी फ़ाइल को स्रोत करते हैं जो पुराने शेल ने किया था। यह कैसे किया जाता है - और यह समझ में आता है - या आप इनपुट के रूप में नए शेल को इनपुट के रूप में फीड करते execहैं। एक बार फ़ाइल को कर्नेल द्वारा किसी भी तरह से कैश किए जाने पर एक बार पढ़ने के बाद।
14

@ माइकर्स क्या मैं इसे सही समझता हूं, कि शेलशॉक का एक बड़ा हिस्सा इस विशेषता से संबंधित है जो कि किसी भी तरह से बहुत आवश्यक नहीं है?
ह्यूमेनिटीएंडपीस

जवाबों:


4

जब कोई स्क्रिप्ट किसी अन्य स्क्रिप्ट को आमंत्रित करती है, तो पैरेंट स्क्रिप्ट के चर निर्यात किए जा सकते हैं, और फिर वे चाइल्ड स्क्रिप्ट में दिखाई देंगे। निर्यात कार्य एक स्पष्ट सामान्यीकरण है: माता-पिता से फ़ंक्शन का निर्यात करें, इसे बच्चे में दिखाई दें।

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

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

निर्यात किए गए कार्य एक पुरानी विशेषता है। SVR2 में बॉर्न शेल में फ़ंक्शंस जोड़े गए थे , और उसी वर्ष (1984) जारी संस्करण 8 शेल में निर्यात किए गए फ़ंक्शन । उस शेल में, चर और फ़ंक्शन समान नामस्थान का उपयोग करते थे। मुझे नहीं पता कि फंक्शन एक्सपोर्ट कैसे काम करता है। विरासत खोल एक बॉर्न प्रकार, जिसमें कार्य करता है लेकिन उन्हें निर्यात नहीं करता है पर आधारित है।

ATT ksh माना जाता है कि यह निर्यात कार्यों का समर्थन करता है, लेकिन स्रोत को देखते हुए या इसके साथ खेलते हुए, मैं यह नहीं देख सकता कि यह k9393 के रूप में है।

env -i /usr/bin/ksh -c 'f=variable; f () { echo function; }; typeset -fx f; /usr/bin/env; ksh -c f'
_=*25182*/usr/bin/env
PWD=/home/gilles
SHLVL=1
A__z="*SHLVL
ksh: f: not found

Ksh का सार्वजनिक डोमेन क्लोन (pdksh, mksh), डैश और zsh निर्यात कार्यों का समर्थन नहीं करते हैं।


1
धन्यवाद! इसलिए, निर्यात कार्यों के बिना सुविधा की कार्यक्षमता खो जाती है, फिर भी कुछ शेल जैसे डैश, zsh और pdksh इत्यादि हैं, जिनमें इस फंक्शनलिटी की कमी है, क्या मैं इसे सही पढ़ता हूं?
humanityANDpeace

लेकिन जब मैं किसी फंक्शन को बैश में एक्सपोर्ट करता हूं, तो वह एक वैरिएबल में चला जाता है BASH_FUNC_f%%=() { echo hi }। अन्य पर्यावरण चर को पार्स क्यों करेगा? BASH_FUNC_g%%जब मैं केवल पुकार रहा हूँ तो यह भी क्यों नहीं होगा f? (जाहिरा तौर पर, पूर्व-शेलशॉक, पर्यावरण चर को बस कहा जाता था fया g- लेकिन मैं अभी भी सोच रहा हूं कि gअगर gमेरी स्क्रिप्ट में मुझे कभी फोन नहीं किया गया तो मुझे क्यों परेशान किया जाएगा )
मेटामॉर्फिक

@Met यह पता लगाने के लिए कि कौन सी फ़ंक्शन परिभाषाएँ हैं, सभी पर्यावरण चर को देखना होगा। यह उस तथ्य को याद कर सकता है और पहली बार इसकी आवश्यकता होने तक किसी फ़ंक्शन के कोड को पार्स करने से बच सकता है, लेकिन यह बहुत कम लाभ के लिए अतिरिक्त जटिलता होगी। यह केवल एक प्रकार का फ़ंक्शन करना आसान है और दो नहीं ("सामान्य फ़ंक्शन" और "एक पर्यावरण चर से फ़ंक्शन जो थोड़ा पार्सिंग की आवश्यकता है")।
गिलेस एसओ- बुराई को रोकना '

अस्पष्ट। मैं सुझाव दे रहा हूं कि करने के लिए स्पष्ट बात होगी, जब मैं कुछ कहा जाता है f, (1) नामक एक शेल फ़ंक्शन के लिए चेक करें f, (2) नामक एक पर्यावरण चर के लिए जांच करें f, और इसे पार्स करने की कोशिश करें, (3) चेक PATHएक निष्पादन योग्य नामक प्रत्येक घटक f। शेल स्टार्टअप पर शेल कोड के रूप में प्रत्येक पर्यावरण चर को कैसे पार्स किया जा सकता है, कम जटिल डिजाइन की तरह लगता है?
रूपांतरित

@Metamorphic आप एक और कदम जोड़ने का सुझाव दे रहे हैं, जिसे हर कमांड पर ख़ुशी से होना चाहिए। फ़ंक्शंस को परिभाषित करने या अपरिभाषित करने के बाद आपको एक और कदम भी जोड़ना unset -f fooहोगा (बाद में , fooअब पर्यावरण में फ़ंक्शन परिभाषा के लिए नहीं दिखना चाहिए ), जब लिस्टिंग फ़ंक्शन (आप declare -fसभी पर्यावरण चर को पढ़ने के अलावा अन्य कैसे संभालते हैं ?) , और जो कुछ भी मैं नहीं सोच रहा हूँ। आपका डिज़ाइन केवल आसान लगता है क्योंकि आपने इसे छोड़ दिया है। इसके विपरीत, स्टार्टअप में सब कुछ करना एक एकल कोड का कोड है और उसके बाद सब कुछ बस काम करता है।
गिल्स एसओ- बुराई को रोकना '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.