POSIX गोले में कार्यों और चर के लिए अलग नामस्थान


13

डैश, फ़ंक्शंस और वैरिएबल में अलग-अलग नामस्थान में रहने के लिए दिखाई देते हैं:

fn(){
    fn="hello world"
}
fn; echo "The value is $fn!" #prints: The value is hello world!
fn; echo "The value is $fn!" #prints: The value is hello world!
#the fn variable doesn't conflict with the fn function

क्या यह डैश-विशिष्ट सुविधा या POSIX गारंटी है?


2
आपका कोड वास्तव में यह साबित नहीं करता है कि fnफ़ंक्शन एक अलग नामस्थान में है; यदि इसे निष्पादित करने के बाद एक बार इसकी परिभाषा मिटा दी गई थी, तो हम ठीक वैसा ही व्यवहार देखेंगे। आपको यह दिखाना चाहिए कि फ़ंक्शन को अभी भी परिभाषित किया गया है, उदाहरण के लिए type fnबाद में।
एलेक्सिस

जवाबों:


13

एक गारंटी :

2.9.5 फंक्शन डेफिनिशन कमांड

एक फ़ंक्शन एक उपयोगकर्ता-परिभाषित नाम है जिसका उपयोग एक साधारण कमांड के रूप में नए स्थितीय मापदंडों के साथ एक कंपाउंड कमांड को कॉल करने के लिए किया जाता है। एक फ़ंक्शन को "फ़ंक्शन डेफिनिशन कमांड" के साथ परिभाषित किया गया है। [...]

फ़ंक्शन का नाम fname है; आवेदन यह सुनिश्चित करेगा कि यह एक नाम है (XBD नाम देखें) और यह एक विशेष अंतर्निहित उपयोगिता का नाम नहीं है। एक कार्यान्वयन एक फ़ंक्शन नाम में अन्य वर्णों को विस्तार के रूप में अनुमति दे सकता है। कार्यान्वयन कार्यों और चर के लिए अलग-अलग नाम स्थान बनाए रखेगा।


यह भी ध्यान रखें कि unsetहै -vऔर -fदिए गए नाम से चर या समारोह unsetting के बीच चयन करने के लिए। bash(जैसा कि अधिकांश अन्य गोले के खिलाफ) अनसेट होगा foo समारोह के साथ unset fooअगर कोई है fooचर एक व्यवहार POSIX द्वारा अनुमति (!),। इसीलिए POSIX लिपियों में हमेशा -vया तो -f( या bashस्क्रिप्ट्स में निश्चित रूप से उपयोग करना अच्छा होता है, लेकिन ध्यान दें कि unsetहमेशा एक वैरिएबल को अनसेट नहीं किया जा सकता है bash, bashवैरिएबल स्कूपिंग में कुछ समस्याएँ हैं)।
स्टीफन चेजेलस

ध्यान दें कि प्री-शेलशॉक बैश में, आपको दिए गए नाम से वेरिएबल और फंक्शन दोनों को एक्सपोर्ट करने में समस्या होगी, क्योंकि बैश दोनों के लिए एक ही एनवायरनमेंट वैरिएबल नेम का उपयोग करके समाप्त होगा (इसे दो बार एनवायरमेंट में डालकर, कुछ कमांड हटा सकते हैं उनमें से एक)
स्टीफन चेज़लस

8

चर और कार्य डैश में विभिन्न नामस्थानों में रहते हैं और यह POSIX द्वारा भी निर्दिष्ट किया गया है :

कार्यान्वयन कार्यों और चर के लिए अलग-अलग नाम स्थान बनाए रखेगा।

इसके अलावा, चर में डिफ़ॉल्ट रूप से वैश्विक गुंजाइश होती है। कुछ गोले (जैसे बाश, ksh और zsh) localकीवर्ड को केवल स्थानीय क्षेत्र के साथ किसी फ़ंक्शन में चर घोषित करने के लिए प्रदान करते हैं ।

तो, हाँ, आप जो व्यवहार देख रहे हैं, वह POSIX द्वारा गारंटीकृत है।

POSIX नहीं किया गया है मानकीकृत local , अभी तक :

एक प्रारंभिक प्रस्ताव में कार्यों का विवरण इस धारणा पर आधारित था कि कार्यों को लघु शैल लिपियों की तरह व्यवहार करना चाहिए; यह है कि, चर साझा करने के अलावा , एक निष्पादन पर्यावरण व्यवहार करना चाहिए जैसे कि वे एक नया निष्पादन वातावरण थे के सबसे तत्वों [..]

[..] एक समारोह के भीतर स्थानीय चर पर विचार किया गया और एक अन्य प्रारंभिक प्रस्ताव (विशेष अंतर्निहित द्वारा नियंत्रित local) में शामिल किया गया, लेकिन उन्हें हटा दिया गया क्योंकि वे कार्यों के लिए विकसित किए गए सरल मॉडल के लायक नहीं हैं और क्योंकि अभी तक जोड़ने के लिए कुछ विरोध था एक और नया विशेष बिल्ट-इन ऐतिहासिक अभ्यास का हिस्सा नहीं था। कार्यान्वयन को पहचानकर्ता local(और साथ ही typesetकॉर्नशेल में उपयोग किया जाना चाहिए) को आरक्षित करना चाहिए , यदि इस मानक के भविष्य के संस्करण में स्थानीय चर तंत्र को अपनाया जाता है।

(जोर मेरा)


राख (80 के दशक के अंत से) जिस पर आधारित पानी का छींटा भी है local, वहां से सबसे अधिक सुसंगत इंटरफेस में से एक (उदाहरण के लिए बाश में गंभीर रूप से टूटे हुए की तुलना में), केवल हाल ही में बैश (4.4) उधार लिया है local -(स्थानीय गुंजाइश के लिए) विकल्प) राख से ( $-केवल एक चर के लिए राख-शैली को लागू करना )। ksh और yash के पास local(केवल pdksh वेरिएंट है local) नहीं है, लेकिन इसके typesetबजाय (ksh93 typesetमें ksh वाक्यविन्यास का उपयोग करके घोषित किए गए फ़ंक्शन में स्थानीय (स्थिर) गुंजाइश प्रदान करता है)।
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.