आईएफएस के डिफ़ॉल्ट मूल्य को समझना


10

मेरे GNU बैश संस्करण 4.2.8 में, IFS का डिफ़ॉल्ट रूप से स्थान, टैब और लाइन फीड का एक डिफ़ॉल्ट मान है:

usr@T42 ~ $ echo -n "$IFS" | hexdump -C
00000000  20 09 0a                                          | ..|
00000003
usr@T42 ~ $ 

क्या ऐसे डिफ़ॉल्ट IFS के लिए कोई कारण है? इसके अलावा, कौन-सी उपयोगिताओं आईएएस का उपयोग करती हैं इसके अलावा बिल्ट-इन read?

जवाबों:


13

IFS चर का उपयोग हर बार शेल एक कार्य करता है जिसे शब्द विभाजन कहा जाता है । सबसे आम मामलों में जहां इसका उपयोग किया जाता है , एक कमांड में पैरामीटर विस्तार (जैसे $var) या कमांड प्रतिस्थापन (जैसे $(some-command)या हटाए गए बैकटिक्स) के बाद होता है। यहां यदि विस्तार में कोई IFSवर्ण है, तो यह कमांड संसाधित होने से पहले अलग-अलग 'शब्दों' में विभाजित हो जाता है। प्रभावी रूप से इसका मतलब है कि ये वर्ण प्रतिस्थापित पाठ को अलग-अलग तर्कों में विभाजित करते हैं (यदि चर पहले निर्दिष्ट किया गया है तो कमांड का नाम भी शामिल है)।

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

शब्द को विभाजित होने से रोकने का एक तरीका यह है कि आप विस्तार ( "$var") के आसपास दोहरे उद्धरण चिह्नों का उपयोग करें - वास्तव में आपने अपने प्रश्न में ऐसा किया है। यदि आप ऐसा नहीं करते हैं तो इसका कोई आउटपुट नहीं echoहोगा क्योंकि इसमें कोई तर्क नहीं होगा, केवल वर्ण विभाजन के तर्क होंगे।

यह भी ध्यान दें कि दो स्थान जहां शब्द का विभाजन पैरामीटर विस्तार के बाद नहीं होता है, चर असाइनमेंट (जैसे var=$othervarऔर var=$(somecommand)ठीक है) के साथ हैं, और [[ ]]निर्माण के भीतर ( [[ $var = $othervar ]]ठीक है, लेकिन [ $var = $othervar ]उद्धृत किया जाना चाहिए)।

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

var=*
echo $var

यह वर्तमान निर्देशिका में फ़ाइलों के नाम प्रदर्शित करेगा।

जैसा कि स्टीफन नीचे बताते हैं , IFSविस्तार के समय पात्रों का क्रम महत्वपूर्ण होता है "$*"। से bashआदमी पेज:

"$*" is equivalent to "$1c$2c...", where c is the first character of the value of
the IFS variable.  If IFS is unset, the parameters are separated by spaces.  If
IFS is null, the parameters are joined without intervening separators.

शब्द बंटवारे के अधिक उदाहरणों के लिए, कृपया यह उत्तर देखें - https://unix.stackexchange.com/a/118444/48083


1
का पहला चरित्र $IFSभी प्रयोग किया जाता है, "$*"जिसके कारण क्रम मायने रखता है।
स्टीफन चेजेलस

2
यह भी ध्यान दें कि zshइसके डिफ़ॉल्ट में NUL वर्ण शामिल हैं $IFS(अन्य गोले उनके चर में NUL वर्ण को पकड़ने का समर्थन नहीं करते हैं)।
स्टीफन चेजलस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.