2013-05-23 11 views
5

Jedna z moich powłok basha daje mi inne zachowanie niż pozostałe. Nie wiem, co zmieniło się ustawienie, ale to sprawdzić:Co może zmienić zachowanie przy zamianie poleceń w bash?

[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 

Na gospodarza Huey, „dla” pętli nad zrobił, czego się spodziewałem: ona podzielona na granicy słów. Na hoście hosta pętla "for" nie podzieliła granic słów, traktowała całość jako pojedynczy element. Podobnie, jeśli użyję $ (ls), potraktuje to całe wielopowierzchniowe coś jako pojedynczy element i wypisze "foo" tuż przed pierwszą linią.

Na obu hostach uruchamiam bash. W innych powłokach bash na hoście hosta działa również normalnie (dzieli się na granicach słów). Co może to zmienić? Oba działają z tą samą wersją basha (co jest "4.2.25 (1) -release (x86_64-pc-linux-gnu)"). Znaki są takie same, ponieważ kopiowałem-wklejałem linię poleceń for-loop za pomocą myszki z tego samego źródła za każdym razem.

Dzięki!

Odpowiedz

4

Sprawdź swój $ 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]:~$ 

i spojrzeć na instrukcji tutaj bash Word Splitting

+0

kurczę Batman! Jesteś niesamowity! Dzięki. :) Zrobiłem "echo $ IFS" w obu powłokach i obaj nic nie pokazali, ale kiedy zrobiłem "unset IFS" w uszkodzonej powłoce, zaczęło działać ponownie. " – Dave

+0

@Do możesz to uruchomić, aby uzyskać kody ascii zmienna IFS: "perl -e" dla $ c (split ("", $ ENV {IFS})) {print ord ($ c), "\ n";} '' – Kelvin

+1

Wygląda na to, że używaliśmy skryptu, który "zapisano" starą wartość $ IFS, wypisując old_ifs = $ IFS, IFS = ":"; ... rób rzeczy ...; IFS = $ old_ifs; Ale jeśli IFS był rozbrojony na początek, to zmienia to na pusty ciąg znaków, co oznacza brak podziału, zamiast rozbrojenia, co oznacza podział na biały obszar. – Dave