2013-05-23 5 views
5

मेरे बैश गोले में से एक मुझे दूसरों की तुलना में अलग व्यवहार दे रहा है। मैं क्या सेटिंग बदल गई है पता नहीं है, लेकिन यह बाहर की जाँच:बैश में कमांड प्रतिस्थापन व्यवहार क्या बदल सकता है?

[email protected]$ for f in $(echo a b c); do echo foo $f; done 
foo a 
foo b 
foo c 
[email protected]$ logout 
Connection to huey closed. 
[email protected]$ for f in $(echo a b c); do echo foo $f; done 
foo a b c 

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

दोनों मेजबानों पर मैं बैश चला रहा हूं। मेजबान एसपीएफ पर अन्य बैश गोले में यह सामान्य रूप से काम करता है (शब्द सीमाओं पर विभाजित)। क्या बदल सकता है? दोनों बैश का एक ही संस्करण चला रहे हैं (जो "4.2.25 (1) है - कृपया (x86_64-pc-linux-gnu)")। वर्ण समान हैं, क्योंकि मैंने माउस के साथ फॉर-लूप कमांड लाइन को कॉपी किया है, दोनों बार एक ही स्रोत से।

धन्यवाद!

उत्तर

4

चेक आपके $ आईएफएस

[email protected]:~$ for f in $(echo a b c); do echo foo $f; done 
foo a 
foo b 
foo c 
[email protected]:~$ export IFS=SOMETHINGBAD 
[email protected]:~$ for f in $(echo a b c); do echo foo $f; done 
foo a b c 
[email protected]:~$ 

और यहाँ bash Word Splitting

+0

पवित्र बकवास बैटमैन पर मैन्युअल पर एक नजर है! तुम कमाल हो! धन्यवाद। :) मैंने दोनों गोले में "$ IFS $ echo" किया था और दोनों ने कुछ भी नहीं दिखाया, लेकिन जब मैंने टूटे हुए खोल में "अनसेट आईएफएस" किया, तो उसने फिर से काम करना शुरू कर दिया। " – Dave

+0

@Dave आप इसे एसीआईआई कोड प्राप्त करने के लिए चला सकते हैं आईएफएस वैरिएबल: $ सी के लिए 'perl -e' (विभाजन ("", $ ENV {IFS})) {प्रिंट ord ($ c), "\ n";} '' – Kelvin

+1

ऐसा लगता है कि हम एक स्क्रिप्ट का उपयोग कर रहे थे old_ifs = $ IFS कहकर $ IFS के पुराने मान को "सहेजा"; IFS = ":"; ... सामान करें ...; IFS = $ old_ifs; लेकिन अगर आईएफएस शुरू होने से परेशान नहीं था, तो यह इसे बदल देता है खाली स्ट्रिंग, जिसका अर्थ है बिना किसी विभाजन के, कोई विभाजन नहीं, जिसका अर्थ है सफेद स्थान पर विभाजित करना। – Dave

संबंधित मुद्दे