ls gera várias colunas mesmo se canalizado para o grep com a configuração zsh do grml

0

Eu apenas decidi dar uma chance ao zsh contra o Bash e me deparei com um comportamento não-adequado sobre o qual não encontrei nada na rede:

Se você fizer um ls | grep foo no Bash, o ls conterá apenas um arquivo por linha, de forma que grep apenas exiba os arquivos correspondentes. Parece que em algum lugar (e desde que eu não consegui encontrar nada na configuração que eu acho que deve ser o próprio código Bash), a opção -1 é passada para ls .
No entanto, zsh não faz essa mágica: se você passar ls sem mais opções para grep , ele fará exatamente isso e você também obterá resultados que coincidentemente apareceram na mesma linha de uma correspondência.

Minha idéia de alcançar o comportamento Bash em zsh seria detectar se uma saída ls será canalizada para grep e definir algo como um alias para tais casos. Mas não tenho certeza de como e se isso é possível.

Atualização: Como o larsks aponta abaixo, o Bash não faz nada de especial aqui e é realmente ls , que deve funcionar dessa maneira se a saída não for para um terminal.

No entanto, eis o que acontece comigo:

> 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

Eu consegui reproduzir isso no Ubuntu 11.10 com zsh 4.3.11 e GNU coreutils 8.5, bem como em uma máquina Debian Squeeze com zsh 4.3.10.

Atualização 2: Ao investigar um pouco mais, descobri que esse erro só aparece quando o grml .zshrc está ativo. Deve haver algo lá que abre um terminal para a saída se for canalizada. Alguém sabe o que procurar?

    
por F30 04.03.2012 / 02:28

2 respostas

1

Ao reduzir para a linha responsável em .zshrc , eu poderia descobrir isso sozinho:

Na verdade, é muito mais simples que algum tipo de terminal virtual para canalização. O erro resulta da linha 1477 da configuração do grml que se parece com isto:

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

Portanto, o comando ls obviamente não é chamado diretamente, mas por meio do alias. E isso explicitamente ativa a saída da coluna através da opção -C .

    
por 04.03.2012 / 15:59
2

De acordo com a documentação ls , esse comportamento é intrínseco ao comando ls :

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

Quando a tubulação para outro processo com | , stdout não deve ser um tty. bash não está fazendo nada de especial.

Em todos os meus testes, usando zsh versão 4.3.15 no Linux e zsh 4.3.11 no OS X, ls se comporta da mesma maneira em zsh , como acontece com bash . Se você realmente acredita que está vendo um comportamento diferente, atualize sua pergunta com (a) a versão de zsh que você está usando e (b) um exemplo completo do problema, mostrando o conteúdo real do diretório e o comando específico linha que você está usando.

    
por 04.03.2012 / 02:49

Tags