IFS नल अशांत IFS के समान नहीं है?


13

मैंने अंडरस्टैंडिंग IFS नामक एक महान प्रश्न यहाँ पढ़ा । मुझे आश्चर्य हुआ क्योंकि जवाब और टिप्पणियां POSIX को उद्धृत करती हैं जिसमें कहा गया है कि IFS = परेशान करने वाले IFS के समान नहीं है। यदि आप IFS को परेशान करते हैं, तो जाहिर तौर पर डिफ़ॉल्ट मान का उपयोग किया जाता है। यदि आप इसके बजाय IFS को शून्य बनाते हैं, तो कोई फाड़नेवाला नहीं है। मुझे पता था कि मैंने उस पर एक अलग ले लिया था, और मैंने इसे अपने बुकमार्क में पाया:

बॉर्न शैल प्रोग्रामिंग

$ आईएफएस

आपकी स्क्रिप्ट में सबसे पहला स्टेटमेंट होना चाहिए

आईएफएस =

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

तो क्या यह कुछ समय पहले सच था या लेखक सिर्फ गलत है?

जवाबों:


20

स्टैक एक्सचेंज पर आपको जो उत्तर मिले हैं वे सही हैं और यह ट्यूटोरियल गलत है। आप अपने आप से प्रयोग कर सकते हैं या इसे मानक में देख सकते हैं । एक अनसेट IFSइसे स्पेस-टैब-न्यूलाइन के डिफ़ॉल्ट मान पर सेट करने के बराबर है, जबकि एक खाली IFSप्रभावी रूप से फ़ील्ड विभाजन को बंद कर देता है।

आप ऐतिहासिक कार्यान्वयन के बारे में IFS पर स्वेन मस्कैच के पेज से परामर्श कर सकते हैं । कुछ ऐतिहासिक गोले पसंद नहीं आए unset IFS, और ksh के एक बहुत पुराने संस्करण ने इसे एक खाली की तरह व्यवहार किया, IFSलेकिन सभी आधुनिक गोले और अधिकांश पुराने गोले IFSडिफ़ॉल्ट मान की तरह एक अशांति का इलाज करते हैं ।

आपको अपनी स्क्रिप्ट IFS=तब तक शुरू नहीं करनी चाहिए जब तक कि आप फ़ील्ड विभाजन को बंद नहीं करना चाहते (जो कि एक उचित निर्णय हो सकता है - लेकिन ध्यान दें कि आपको ग्लोबिंग से बचने के लिए प्रतिस्थापन के आसपास दोहरे उद्धरण लगाने की आवश्यकता है, जब तक कि आप set -fभी बंद न करें )। डिफ़ॉल्ट मान को रीसेट करने के लिए, का उपयोग करें unset IFS। यह बहस योग्य है कि क्या यह एक स्क्रिप्ट की शुरुआत में उपयोगी है; अन्य बहुत सारी बुरी चीजें हैं जैसे PATHकि डोडी जो कॉलर आपकी स्क्रिप्ट को गलत बनाने के लिए कर सकता है।

यह ट्यूटोरियल रीसेट करने की सलाह भी देता है PATH। यह आमतौर पर बुरी सलाह है। ज्यादातर मामलों में, आप भविष्यवाणी नहीं कर सकते कि सही खोज पथ क्या है, लेकिन उपयोगकर्ता जानता है। तुम्हें कैसे पता कि क्या करना /usr/local/binया /home/bob/binएक प्राचीन यूनिक्स पर उपयोगिताओं के बग तय संस्करणों में शामिल है जहां में लोगों को /usr/binगाड़ी कर रहे हैं? क्या आप वास्तव में यह पता लगाने के लिए कि क्या /usr/xpg6/binआगे रखना चाहते हैं सभी तर्क एम्बेड करना चाहते हैं /bin? आपको किस पद पर चाहिए /usr/gnu/bin? जब तक आपकी स्क्रिप्ट एक विशिष्ट प्रणाली को लक्षित न करे, तब तक PATH को रीसेट न करें।

मैंने इस ट्यूटोरियल को नहीं पढ़ा है, लेकिन मैंने एक चीज़ की जाँच की है: यह आपको शुरू से ही सही नहीं बताता है कि हमेशा चर प्रतिस्थापन और कमांड प्रतिस्थापन के आसपास दोहरे उद्धरण दें। इसलिए मुझे नहीं लगता कि यह ट्यूटोरियल अच्छा है।


unset IFSहालांकि यह फ़ील्ड-विभाजन को रीसेट करता है, तो IFS को अपने डिफ़ॉल्ट मान को bash में रीसेट नहीं करता है।
16

@Melab अपने डिफ़ॉल्ट मान पर unset IFSरीसेट नहीं करता है IFS, यह इसे अनसेट करता है। लेकिन एक अनसेट IFSका IFSडिफ़ॉल्ट मान पर सेट के समान प्रभाव पड़ता है ।
गिल्स एसओ- बुराई को रोकें '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.