Was ist das magische Trennzeichen zwischen Dateinamen in der Ausgabe von ls?

20

Die Ausgabe von ls(ohne Argumente) scheint Dateinamen durch Zeilenumbrüche zu trennen.

Beweis:

  • ls | grep fooFunktioniert wie erwartet, wobei grepjeder Dateiname als separate Eingabezeile behandelt wird.

  • ls > files.txt; vim files.txt -> In Vim befindet sich jede Datei in einer separaten Zeile

Und doch werden bei der Ausgabe von im Terminal lsmehrere Dateien in einer Zeile abgelegt, wobei die Dateinamen durch Leerzeichen getrennt werden, um gut ausgerichtete Spalten zu erstellen:

$ ls
a.txt  b.txt  c.txt

Meine Frage ist also, wie macht man das?

Verwenden Sie ein spezielles Steuerzeichen, um eine neue Zeile zu "fälschen"? Oder weiß es, wann seine Ausgabe an einen anderen Befehl weitergeleitet wird, und formatiert seine Ausgabe in diesem Fall anders?

Chris B
quelle

Antworten:

24

Oder weiß es, wann seine Ausgabe an einen anderen Befehl weitergeleitet wird, und formatiert seine Ausgabe in diesem Fall anders?

Ja. Aus dem vollständigen Handbuch (verfügbar durch, info lswenn die Dokumentation installiert ist):

Wenn die Standardausgabe ein Terminal ist, erfolgt die Ausgabe in Spalten (vertikal sortiert) und Steuerzeichen werden als Fragezeichen ausgegeben. Andernfalls wird die Ausgabe zeilenweise aufgelistet und die Steuerzeichen werden unverändert ausgegeben.

Wenn Ihnen die einspaltige Ausgabe gefällt, können Sie sie ausführen

ls -1

um es auch im Terminal zu bekommen.

Daniel Andersson
quelle
7
Insbesondere bestimmt die Funktion ls, ob der Ausgang ein Terminal ist oder nicht isatty(3).
Blrfl
Auch etwas verwandt, wenn man dies in einem einfachen Shell-Skript testen möchte, kann man tty -sdessen Rückgabestatus ausführen und überprüfen.
Daniel Andersson
10

lsErkennt es, wenn Sie den Ausgang leiten. Sie können es in der Dokumentation sehen:

Wenn die Standardausgabe ein Terminal ist, erfolgt die Ausgabe in Spalten (vertikal sortiert) und Steuerzeichen werden als Fragezeichen ausgegeben. Andernfalls wird die Ausgabe zeilenweise aufgelistet und die Steuerzeichen werden unverändert ausgegeben.

Wenn Sie möchten, dass jede Datei in der Ausgabe unabhängig von der Pipe-Umleitung in einer separaten Zeile platziert wird, können Sie verwenden

ls -1
MilanorTSW
quelle