Qual é o separador mágico entre nomes de arquivos na saída ls?

18

A saída de ls (sem argumentos) aparece para separar nomes de arquivos com quebras de linha.

Evidências:

  • ls | grep foo funciona como esperado, com grep tratando cada nome de arquivo como uma linha separada de entrada.

  • ls > files.txt; vim files.txt - > no Vim, cada arquivo está em uma linha separada

No entanto, no terminal, a saída de ls coloca vários arquivos em uma linha, separando os nomes de arquivos com espaços para criar colunas bem alinhadas:

$ ls
a.txt  b.txt  c.txt

Então, minha pergunta é: como faço isso?

Está usando algum caractere de controle especial para "falsificar" uma nova linha? Ou ele sabe quando sua saída está sendo canalizada para outro comando e formata sua saída de maneira diferente neste caso?

    
por Chris B 14.05.2012 / 12:31

2 respostas

23

Or does it know when its output is being piped to another command, and format its output differently in this case?

Sim. Do manual completo (disponível em info ls se a documentação estiver instalada):

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.

Se você gosta da saída de uma coluna, pode executar

ls -1

para obtê-lo no terminal também.

    
por 14.05.2012 / 12:38
10

ls detecta quando você canaliza sua saída. Você pode ver isso na documentação:

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.

Se você quiser que cada arquivo na saída seja colocado em uma linha separada, independentemente do redirecionamento do pipe, você pode usar

ls -1
    
por 14.05.2012 / 12:42