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

20

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

Evidência:

  • ls | grep foofunciona como esperado, greptratando cada nome de arquivo como uma linha de entrada separada.

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

E, no terminal, a saída lscoloca vários arquivos em uma linha, separando os nomes dos arquivos com espaços para criar colunas bem alinhadas:

$ ls
a.txt  b.txt  c.txt

Então, minha pergunta é: como isso é feito?

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 nesse caso?

Chris B
fonte

Respostas:

24

Ou ele sabe quando sua saída está sendo canalizada para outro comando e formata sua saída de maneira diferente nesse caso?

Sim. No manual completo (disponível até info lsse a documentação estiver instalada):

Se a saída padrão for um terminal, a saída será em colunas (classificadas verticalmente) e os caracteres de controle serão exibidos como pontos de interrogação; caso contrário, a saída será listada uma por linha e os caracteres de controle serão exibidos como estão.

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

ls -1

para obtê-lo no terminal também.

Daniel Andersson
fonte
7
Especificamente, a função lsusa para determinar se a saída é ou não um terminal isatty(3).
Blrfl 14/05
Também um pouco relacionado, se alguém quiser testar isso em um simples shell script, poderá executar tty -se verificar seu status de retorno.
Daniel Andersson
10

lsdetecta quando você canaliza sua saída. Você pode vê-lo na documentação:

Se a saída padrão for um terminal, a saída será em colunas (classificadas verticalmente) e os caracteres de controle serão exibidos como pontos de interrogação; caso contrário, a saída será listada uma por linha e os caracteres de controle serão exibidos como estão.

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

ls -1
MilanorTSW
fonte