A saída de ls possui novas linhas, mas é exibida em uma única linha. Por quê?

36

Acho que posso estar negligenciando um ponto relativamente fundamental em relação ao shell. A saída do comando ls por padrão separa a saída com novas linhas, mas o shell exibe a saída em uma única linha.

Alguém pode explicar isso para mim? Eu sempre presumi que a saída era simplesmente separada por espaços, mas agora que vejo a saída separada por novas linhas, esperaria que a saída fosse exibida em linhas separadas.

Exemplo:

cpoweradm@debian:~/lpi103-4$ ls text*
text1  text2  text3

od mostra que a saída é separada por novas linhas:

cpoweradm@debian:~/lpi103-4$ ls text* | od -c
0000000   t   e   x   t   1  \n   t   e   x   t   2  \n   t   e   x   t
0000020   3  \n
0000022

Se novas linhas estiverem presentes, por que a saída não é exibida como:

text1 
text2
text3
    
por zod90 01.04.2011 / 04:31

2 respostas

35

Quando você canaliza a saída, ls age de maneira diferente.

Este fato está oculto na documentação de informações :

If standard output is a terminal, the output is in columns (sorted vertically) and control characters are output as question marks; otherwise, the output is listed one per line and control characters are output as-is.

Para provar, tente executar

ls

e depois

ls | less

Isso significa que, se você quiser que a saída seja garantida como um arquivo por linha, independentemente de estar sendo canalizada ou redirecionada, você precisa executar

ls -1

( -1 é o número um)

Ou, você pode forçar o ls | less a gerar colunas usando

ls -C

( -C é um C maiúsculo)

    
por 01.04.2011 / 04:36
3

Sua descoberta destaca a principal razão pela qual analisar a saída de ls é sempre uma má ideia. Veja o wiki de Greg para uma explicação completa .

Pense no seu problema ao contrário. Você percebeu que às vezes faz e às vezes não imprime novas linhas entre as saídas. Para uso em scripts ou quando for forçado pelo -1 flag, isso ocorre. Uma nova linha no final de cada arquivo. O que há não garante que cada nova linha representa um novo nome de arquivo . De fato, se um nome de arquivo contiver uma nova linha, a saída de ls será totalmente não analisável. Considere estes nomes de arquivos:

file1
file2\nfile3
file4

Quando você ls -1 um diretório com ele, você teria algo parecido com isto:

file1
file2
file3
file4

Você não pensaria naturalmente que havia quatro arquivos? Todos os scripts que analisam a saída de ls. Na realidade, existem três arquivos, um com um nome complicado, mas você não seria capaz de descobrir isso a partir da saída de ls. *

* A menos que você esteja usando o -l flag e tenha notado que a saída foi borked, mas seus scripts ainda seriam bloqueados.

    
por 29.06.2011 / 12:48