आप आवश्यकतानुसार IFS को सेव और असाइन कर सकते हैं। ऐसा करने में कुछ भी गलत नहीं है। एक अस्थायी, शीघ्र संशोधन के बाद अपने सरणी असाइनमेंट उदाहरण की तरह इसके मूल्य को बचाने के लिए यह असामान्य नहीं है।
जैसा कि @llua ने आपके प्रश्न के लिए अपनी टिप्पणी में उल्लेख किया है, बस IFS को परेशान करने से डिफ़ॉल्ट व्यवहार बहाल होगा, जो स्पेस-टैब-न्यूलाइन असाइन करने के बराबर है।
यह विचार करने लायक है कि ऐसा करने के लिए स्पष्ट रूप से IFS को स्पष्ट रूप से सेट / अनसेट नहीं करना अधिक समस्याग्रस्त हो सकता है।
POSIX 2013 संस्करण से, 2.5.3 शैल चर :
कार्यान्वयन पर्यावरण में IFS के मूल्य, या पर्यावरण से IFS की अनुपस्थिति को अनदेखा कर सकता है, जिस समय शेल को लागू किया जाता है, उस स्थिति में शेल IFS को <space> <टैब> <newline> पर सेट करेगा जब इसे लागू किया जाता है ।
एक POSIX- आज्ञाकारी, आह्वान किया गया शेल अपने वातावरण से IFS को विरासत में ले सकता है या नहीं भी ले सकता है। इस प्रकार से:
- एक पोर्टेबल स्क्रिप्ट पर्यावरण के माध्यम से भरोसेमंद रूप से IFS को विरासत में नहीं दे सकती है।
- एक स्क्रिप्ट जो केवल डिफ़ॉल्ट विभाजन व्यवहार (या शामिल होने के मामले में
"$*"
) का उपयोग करने का इरादा रखती है , लेकिन जो एक शेल के तहत चल सकती है जो पर्यावरण से IFS को प्रारंभ करती है, स्पष्ट रूप से पर्यावरण घुसपैठ के खिलाफ बचाव के लिए IFS को सेट / अनसेट करना होगा।
एनबी यह समझना महत्वपूर्ण है कि इस चर्चा के लिए "आह्वान" शब्द का एक विशेष अर्थ है। एक शेल केवल तब ही लागू किया जाता है जब इसे स्पष्ट रूप से अपने नाम का उपयोग करके बुलाया जाता है (एक #!/path/to/shell
शबंग सहित )। एक उपधारा - जैसे कि द्वारा बनाया जा सकता है $(...)
या cmd1 || cmd2 &
- एक आह्वानित शेल नहीं है, और इसका IFS (इसके निष्पादन के अधिकांश वातावरण के साथ) इसके माता-पिता के समान है। एक आह्वान किया गया शेल $
अपने पिड का मूल्य निर्धारित करता है , जबकि उप-भाग इसे विरासत में मिलाते हैं।
यह महज एक पांडित्य नहीं है; इस क्षेत्र में वास्तविक विचलन है। यहां एक संक्षिप्त स्क्रिप्ट है जो कई अलग-अलग गोले का उपयोग करके परिदृश्य का परीक्षण करती है। यह एक संशोधित :
शेल में एक संशोधित IFS (सेट ) को निर्यात करता है जो तब अपने डिफ़ॉल्ट IFS को प्रिंट करता है।
$ cat export-IFS.sh
export IFS=:
for sh in bash ksh93 mksh dash busybox:sh; do
printf '\n%s\n' "$sh"
$sh -c 'printf %s "$IFS"' | hexdump -C
done
IFS को आम तौर पर निर्यात के लिए चिह्नित नहीं किया जाता है, लेकिन, अगर यह होता है, तो ध्यान दें कि कैसे bash, ksh93 और mksh अपने पर्यावरण की उपेक्षा करते हैं IFS=:
, जबकि डैश और बिजीबॉक्स इसे सम्मानित करते हैं।
$ sh export-IFS.sh
bash
00000000 20 09 0a | ..|
00000003
ksh93
00000000 20 09 0a | ..|
00000003
mksh
00000000 20 09 0a | ..|
00000003
dash
00000000 3a |:|
00000001
busybox:sh
00000000 3a |:|
00000001
कुछ संस्करण जानकारी:
bash: GNU bash, version 4.3.11(1)-release
ksh93: sh (AT&T Research) 93u+ 2012-08-01
mksh: KSH_VERSION='@(#)MIRBSD KSH R46 2013/05/02'
dash: 0.5.7
busybox: BusyBox v1.21.1
भले ही bash, ksh93, और mksh पर्यावरण से IFS को इनिशियलाइज़ न करें, लेकिन वे अपने संशोधित IFS को फिर से एक्सपोर्ट करते हैं।
यदि किसी कारण से आपको पर्यावरण के माध्यम से IFS को आंशिक रूप से पारित करने की आवश्यकता है, तो आप IFS का उपयोग करके ऐसा नहीं कर सकते हैं; आपको किसी भिन्न चर के लिए मान असाइन करने और निर्यात के लिए उस चर को चिह्नित करने की आवश्यकता होगी। फिर बच्चों को अपने आईएफएस को उस मूल्य को स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता होगी।