Dane wyjściowe ls
(bez argumentów) wydają się oddzielać nazwy plików z podziałem wierszy.
Dowód:
ls | grep foo
działa zgodnie z oczekiwaniami,grep
traktując każdą nazwę pliku jako osobny wiersz danych wejściowych.ls > files.txt; vim files.txt
-> w Vimie, każdy plik znajduje się w osobnej linii
A jednak w terminalu dane wyjściowe ls
umieszczają wiele plików w jednym wierszu, oddzielając nazwy plików spacjami, aby uzyskać ładnie wyrównane kolumny:
$ ls
a.txt b.txt c.txt
Więc moje pytanie brzmi: jak to robi?
Czy używa jakiegoś specjalnego znaku kontrolnego do „sfałszowania” nowej linii? Czy może wie, kiedy dane wyjściowe są przesyłane potokowo do innej komendy i w tym przypadku formatuje dane wyjściowe inaczej?
ls
używa do ustalenia, czy wyjście jest terminalemisatty(3)
.tty -s
i sprawdzić jego status powrotu.ls
wykrywa go, gdy potokujesz jego wyjście. Możesz to zobaczyć w dokumentacji:Jeśli chcesz, aby każdy plik wyjściowy był umieszczony w osobnej linii niezależnie od przekierowania potoku, możesz użyć
źródło