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?
lsusa para determinar se a saída é ou não um terminalisatty(3).