ls
retorna a saída em várias colunas, enquanto ls|cat
retorna saída idêntica a byte ls -1
para os diretórios que tentei. Ainda vejo ls -1
respostas encanadas, como ls -1|wc -l
. Existe alguma razão para preferir ls -1
? Por que ...|cat
alterar a saída de ls
?
19
n=0; for i in .* *; do ((n++)) ; done ; echo $n
(largar o. * se não quiser contar essas). ou:ls -1d ./.* ./* | grep '^\./' | wc -l
(como os nomes dos arquivos não podem conter '/')ls
a saída para um terminal geralmente inclui códigos de cores por padrão. Para saída para um não terminal, a cor geralmente é desativada por padrão. No GNU, isso é--color={always,auto,never}
IIRC. Se a cor estiver incluída em uma, mas não na outra, as saídas poderão parecer idênticas na tela, mas não serão byte idênticas (os códigos de cores fazem parte da saída de ls).Respostas:
ls
testa se a saída está indo para um terminal. Se a saída não estiver indo para um terminal, então-1
é o padrão. (Isso pode ser substituído por um dos-C
,-m
ou-x
opções.)Portanto, quando
ls
for usado em um pipeline e você não o tiver substituído por outra opção,ls
será usado-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 padrão de coluna única são:
Documentação GNU
No manual 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
separadas por vírgula,-C
ordenadas-x
por colunas e ordenadas por:fonte
-1
como padrão, exceto quando a saída vai para o terminal (ou outras condições)Por que canalizar a saída padrão altera o comportamento de
ls
? Porque foi projetado dessa maneira. 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 dizEntão você pode ver que a saída para um arquivo funcionará da mesma forma que a saída para um pipe; isto é, uma entrada por linha, como se
-1
tivesse sido especificada.ls
está gravando em um terminal, espera que um ser humano esteja observando a saída. As pessoas preferem obter informações no número mínimo necessário de linhas, para que as coisas não rolem na tela.ls
está gravando em um canal, 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 precisar analisar colunas (já que os nomes de arquivos podem conter espaços).ls -1
quando você está gravando em um arquivo ou canal? Não.fonte
Ao canalizar ls, ls não pode determinar quantas colunas o console realmente possui (independente do comando do lado direito). Então, basta fazer isso por sua própria escolha ou, em outras palavras, esse comportamento é instável e pode mudar em versões futuras.
Por outro lado,
ls -1
foi criado com a finalidade de contar ou criar scripts em geral, portanto, seu comportamento é estável.fonte