Jaki jest magiczny separator między nazwami plików w wynikach ls?

18

Dane wyjściowe ls(bez argumentów) wydają się oddzielać nazwy plików z podziałem wierszy.

Dowód:

  • ls | grep foodziała zgodnie z oczekiwaniami, greptraktują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 lsumieszczają 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?

Chris B.
źródło

Odpowiedzi:

23

Czy może wie, kiedy dane wyjściowe są przesyłane potokowo do innej komendy i w tym przypadku formatuje dane wyjściowe inaczej?

Tak. Z pełnej instrukcji (dostępnej, info lsjeśli dokumentacja jest zainstalowana):

Jeśli standardowym wyjściem jest terminal, dane wyjściowe są w kolumnach (posortowane pionowo), a znaki sterujące są wyprowadzane jako znaki zapytania; w przeciwnym razie dane wyjściowe są wyświetlane po jednym w wierszu, a znaki sterujące są wyświetlane w niezmienionej postaci.

Jeśli podoba Ci się wyjście z jedną kolumną, możesz uruchomić

ls -1

aby dostać go również w terminalu.

Daniel Andersson
źródło
7
W szczególności funkcja lsużywa do ustalenia, czy wyjście jest terminalem isatty(3).
Blrfl
Również nieco spokrewnione, jeśli chce się to przetestować w prostym skrypcie powłoki, można uruchomić tty -si sprawdzić jego status powrotu.
Daniel Andersson
10

lswykrywa go, gdy potokujesz jego wyjście. Możesz to zobaczyć w dokumentacji:

Jeśli standardowym wyjściem jest terminal, dane wyjściowe są w kolumnach (posortowane pionowo), a znaki sterujące są wyprowadzane jako znaki zapytania; w przeciwnym razie dane wyjściowe są wyświetlane po jednym w wierszu, a znaki sterujące są wyświetlane w niezmienionej postaci.

Jeśli chcesz, aby każdy plik wyjściowy był umieszczony w osobnej linii niezależnie od przekierowania potoku, możesz użyć

ls -1
MilanorTSW
źródło