A saída de ls
(sem argumentos) parece separar os nomes de arquivos com quebras de linha.
Evidência:
ls | grep foo
funciona como esperado,grep
tratando 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 ls
coloca 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?
ls
usa para determinar se a saída é ou não um terminalisatty(3)
.tty -s
e verificar seu status de retorno.ls
detecta quando você canaliza sua saída. Você pode vê-lo na documentação:Se você deseja que cada arquivo na saída seja colocado em uma linha separada, independentemente do redirecionamento de canal, você pode usar
fonte