Postanowiłem dać Zsh szansę na przeciw Bashowi i natknąłem się na jakieś nieprzyzwoite zachowanie, o którym nie mogłem znaleźć niczego w sieci:
Jeśli wykonasz a ls | grep foow Bash, lstylko jeden plik w wierszu, więc wyświetla greptylko pasujące pliki. Wydaje się, że gdzieś (a ponieważ nie mogłem znaleźć niczego w konfiguracji, myślę, że musi to być sam kod Bash), -1opcja jest przekazywana do ls.
zsh jednak nie robi tej magii: jeśli przejdziesz lsbez dalszych opcji grep, to właśnie to zrobi, a także otrzymasz wyniki, które przypadkowo pojawiły się w tej samej linii jako dopasowanie.
Mój pomysł na osiągnięcie zachowania Bash w zsh polegałby na wykryciu, czy dane lswyjściowe zostaną wprowadzone do potoku grepi zdefiniowaniu czegoś takiego jak alias dla takich przypadków. Ale nie jestem pewien, jak i czy to w ogóle możliwe.
Aktualizacja: Jak pokazują poniższe Larki, Bash nie robi tutaj nic specjalnego i tak naprawdę lspowinno działać w ten sposób, jeśli dane wyjściowe nie trafią do terminala.
Niemniej jednak oto co się ze mną dzieje:
> ls
a b c d e f g h
bash$ ls | grep b
b
zsh> ls | grep b
a b c d e f g h
Udało mi się to odtworzyć na Ubuntu 11.10 z zsh 4.3.11 i GNU coreutils 8.5, a także na maszynie Debian Squeeze z zsh 4.3.10.
Aktualizacja 2: Badając nieco więcej, dowiedziałem się, że ten błąd pojawia się tylko wtedy, gdy plik grml .zshrc jest aktywny. Musi tam być coś, co otwiera terminal dla wyjścia, jeśli jest on potokowany. Czy ktoś wie, czego szukać?
lsjest uważane za złą praktykę