ls wyprowadza wiele kolumn, nawet jeśli jest potokowany do grep przy pomocy zsh config grml

0

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ć?

F30
źródło
Warto wiedzieć, że analizowanie wyniku lsjest uważane za złą praktykę
rahmu

Odpowiedzi:

2

Zgodnie z lsdokumentacją takie zachowanie jest nieodłączne od lspolecenia:

`-1'
`--format=single-column'
     List one file per line.  This is the default for `ls' when standard
     output is not a terminal.

Podczas przesyłania do innego procesu za pomocą |, stdoutnie powinno być tty. bashnie robi nic specjalnego.

We wszystkich moich testach korzystanie z zshwersji 4.3.15 w systemie Linux i zsh4.3.11 w systemie OS X lszachowuje się tak samo zshjak pod bash. Jeśli naprawdę uważasz, że widzisz inne zachowanie, zaktualizuj swoje pytanie o (a) używaną wersję zshi (b) pełny przykład problemu, pokazujący zarówno rzeczywistą zawartość katalogu, jak i konkretną linię poleceń, którą „ ponownie używam.

Larsks
źródło
1

Zawężając się do linii odpowiedzialnej .zshrc, mogłem sam to zrozumieć:

Jest to w rzeczywistości o wiele prostsze niż wirtualny terminal do pipingu. Błąd wynika z wiersza 1477 konfiguracji grml, który wygląda następująco:

alias ls='ls -b -CF '${ls_options:+"${ls_options[*]} "}

Więc lspolecenie oczywiście nie jest wywoływane bezpośrednio, ale poprzez alias. I to wyraźnie aktywuje wyjście kolumny za pomocą -Copcji.

F30
źródło