ls
retorna a saída em várias colunas, enquanto ls|cat
retorna a saída de bytes idênticos ls -1
aos diretórios que tentei. Ainda vejo ls -1
canalizado em respostas, como ls -1|wc -l
. Existe alguma razão para preferir ls -1
? Por que ...|cat
alterar a saída de ls
?
ls
testa se a saída está indo para um terminal. Se a saída não for para um terminal, então-1
é o padrão. (Isso pode ser substituído por uma das opções-C
,-m
ou-x
.)Assim, quando
ls
é usado em um pipeline e você não o substituiu por outra opção,ls
usará-1
. Você pode confiar nisso porque esse comportamento é exigido pelo POSIXEspecificação POSIX
O POSIX requer
-1
como padrão sempre que a saída não for para um terminal:A especificação POSIX :
Essas três opções que substituem o formato de coluna única padrão são:
Documentação GNU
Do manual do GNU ls :
Exemplos
Vamos criar três arquivos:
Quando a saída vai para um terminal, o GNU
ls
escolhe usar um formato de várias colunas:Quando a saída vai para um pipeline, a especificação POSIX exige que a coluna única seja o padrão:
As três exceções que substituem o comportamento padrão de coluna única são
-m
para colunas separadas por vírgula,-C
para colunas classificadas e-x
para colunas classificadas:Por que canalizar a saída padrão altera o comportamento de
ls
? Porque foi projetado assim. A Especificação POSIX diz:que é realmente ambíguo sobre o comportamento padrão (quando não especificado por uma opção como
-l
ou-1
) com saída para um terminal, e a documentação do GNU Coreutils dizAssim, você pode ver que a saída para um arquivo funcionará da mesma forma que a saída para um pipe; ou seja, uma entrada por linha, como se
-1
tivesse sido especificada.ls
está escrevendo em um terminal, espera que um ser humano esteja olhando para a saída. As pessoas vão preferir obter informações no mínimo necessário de linhas, para que as coisas não rolem da tela.ls
está gravando em um pipe, espera que outro programa esteja lendo a saída. É muito mais fácil para um programa ler dados com um valor por linha do que tentar analisar colunas (já que nomes de arquivos podem conter espaços).ls -1
quando você está gravando em um arquivo ou pipe? Não.Ao canalizar ls, ls não pode determinar quantas colunas o console realmente possui (independente do comando do lado direito). So ls apenas faz isso por sua própria escolha, ou seja, esse comportamento é instável e pode mudar em versões futuras.
Por outro lado,
ls -1
foi criado com a finalidade de contagem ou script em geral, portanto, seu comportamento é estável.