Eu acho que posso estar ignorando 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 me explicar isso? Sempre presumi que a saída fosse 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
ls
. É útil, mas é claramente inconsistente e surpreendente. Mas observe que alguns comandos que produzem saída colorida removerão as cores ao serem canalizados também.ls
sempre imprime um por linha elc
sempre imprime em colunas.dpkg -l
usará toda a largura da tela, mas se estiver imprimindo em um tubo, assume que o terminal tem 80 colunas de largura e abrevia a saída para ajustá-la, se necessário.Sua descoberta destaca o principal motivo pelo qual a análise da saída
ls
é sempre uma má ideia. Veja o wiki de Greg para uma explicação completa .Pense no seu problema ao contrário. Você notou que ls às vezes imprime e às vezes não imprime novas linhas entre a saída. Para uso em scripts ou quando forçado pelo
-1
sinalizador, ele faz. Uma nova linha no final de cada arquivo. O que não há garantia de que cada nova linha represente um novo nome de arquivo . De fato, se um nome de arquivo contiver uma nova linha, a saída de ls será absolutamente impossível de analisar. Considere estes nomes de arquivos:Quando você
ls -1
cria um diretório com isso, obtém algo parecido com isto:Você naturalmente não pensaria que havia quatro arquivos? Assim como qualquer script que analise 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ê estivesse usando o
-l
sinalizador e percebesse que a saída estava funcionando, mas seus scripts ainda seriam bloqueados.fonte
ls
, a-b
opção pode ajudar. Acontece o em nova linha\n
, etc.