2013-05-23 6 views
5

Eine meiner Bash-Shells gibt mir ein anderes Verhalten als die anderen. Ich weiß nicht, welche Einstellung geändert hat, aber check this out:Was kann das Befehlssubstitutionsverhalten in bash ändern?

[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 

Auf Host huey, die „für“ Schleife über tat, was ich erwartet hatte: es aufgeteilt auf Wortgrenzen. Auf Host-SPF wurde die "for" -Schleife nicht an Wortgrenzen aufgeteilt, sondern das Ganze als einzelnes Element behandelt. Ähnlich, wenn ich $ (ls) verwende, behandelt es das ganze große mehrzeilige Ding als ein einzelnes Element und druckt "foo" direkt vor der ersten Zeile.

Auf beiden Hosts bin ich bash laufen. In anderen Bash-Shells auf Host-SPF funktioniert es auch normal (Splits auf Wortgrenzen). Was könnte das ändern? Beide laufen die gleiche Version von bash (was "4.2.25 (1) -Release (x86_64-pc-linux-gnu)" ist). Die Zeichen sind die gleichen, da ich die for-loop Befehlszeile mit der Maus von der gleichen Quelle beide Male kopierte.

Danke!

Antwort

4

Überprüfen Sie Ihre $ IFS

[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]:~$ 

und haben einen Blick in das Handbuch hier bash Word Splitting

+0

Holy crap batman! Du bist unglaublich! Vielen Dank. :) Ich habe "echo $ IFS" in beiden Shells und beide zeigten nichts, aber wenn ich "IFS" in der defekten Shell löschte, begann es wieder zu arbeiten. " – Dave

+0

@Dave Sie können dies ausführen, um die Ascii-Codes von zu bekommen die IFS-Variable: 'perl -e 'für $ c (split (" ", $ ENV {IFS})) {print ord ($ c)," \ n ";}' – Kelvin

+1

Sieht so aus, als hätten wir ein Skript benutzt "speicherte" den alten Wert von $ IFS, indem er sagte old_ifs = $ IFS; IFS = ":"; ... tu stuff ...; IFS = $ old_ifs; Aber wenn IFS zu Beginn nicht gesetzt war, ändert sich dies die leere Zeichenfolge, die KEIN Aufteilen bedeutet, statt Unscharf, was bedeutet, dass sie auf Leerzeichen aufgeteilt wird. – Dave