ls
Gibt die Ausgabe in mehreren Spalten zurück, während die ls|cat
Ausgabe ls -1
für Verzeichnisse, die ich ausprobiert habe, Byte-identisch ist . Trotzdem sehe ich ls -1
in Antworten wie gepiped ls -1|wc -l
. Gibt es jemals einen Grund, es vorzuziehen ls -1
? Warum ändert ...|cat
sich die Ausgabe von ls
?
19
n=0; for i in .* *; do ((n++)) ; done ; echo $n
(lassen Sie das. * fallen, wenn Sie diese nicht zählen möchten). oder:ls -1d ./.* ./* | grep '^\./' | wc -l
(da Dateinamen nicht '/' enthalten dürfen)ls
Die Ausgabe an ein Terminal enthält standardmäßig Farbcodes. Für die Ausgabe auf einem Nicht-Terminal ist die Farbe normalerweise standardmäßig deaktiviert. In GNU ist das--color={always,auto,never}
IIRC. Wenn Farbe in einer, aber nicht in einer anderen enthalten ist, erscheinen die Ausgaben auf dem Bildschirm möglicherweise identisch, sind jedoch nicht byteidentisch (Farbcodes sind Teil der Ausgabe von ls).Antworten:
ls
Testet, ob die Ausgabe an ein Terminal gesendet wird. Wenn die Ausgabe nicht an ein Terminal gesendet wird,-1
ist dies die Standardeinstellung. (Dies kann durch eine der außer Kraft gesetzt werden-C
,-m
oder-x
Optionen.)Wenn
ls
also in einer Pipeline verwendet wird und Sie sie nicht mit einer anderen Option überschrieben haben,ls
wird verwendet-1
. Darauf können Sie sich verlassen, da dieses Verhalten von POSIX gefordert wirdPOSIX-Spezifikation
POSIX erfordert
-1
als Standard, wann immer die Ausgabe nicht an ein Terminal geht:Die POSIX-Spezifikation :
Diese drei Optionen, die das standardmäßige einspaltige Format überschreiben, sind:
GNU-Dokumentation
Aus dem GNU-Handbuch :
Beispiele
Lassen Sie uns drei Dateien erstellen:
Wenn die Ausgabe an ein Terminal geht,
ls
wählt GNU die Verwendung eines mehrspaltigen Formats:Wenn die Ausgabe an eine Pipeline gesendet wird, erfordert die POSIX-Spezifikation, dass die Standardeinstellung einspaltig ist:
Die drei Ausnahmen, die das Standardverhalten für einzelne Spalten außer Kraft setzen, gelten
-m
für kommagetrennte,-C
nach unten sortierte und-x
nach oben sortierte Spalten:quelle
-1
Warum ändert das Leiten der Standardausgabe das Verhalten von
ls
? Weil es so konzipiert wurde. Die POSIX-Spezifikation besagt:Das ist eigentlich mehrdeutig über das Standardverhalten (wenn nicht durch eine Option wie
-l
oder angegeben-1
) bei der Ausgabe auf ein Terminal, und die GNU Coreutils-Dokumentation sagtSie können also sehen, dass die Ausgabe in eine Datei genauso funktioniert wie die Ausgabe in eine Pipe. das heißt, ein Eintrag pro Zeile, als ob
-1
angegeben worden wäre.ls
in ein Terminal geschrieben wird, wird erwartet, dass ein Mensch auf die Ausgabe schaut. Die Leute werden es vorziehen, Informationen in der minimal erforderlichen Anzahl von Zeilen zu erhalten, damit nichts über den Bildschirm rollt.ls
Schreiben in eine Pipe wird erwartet, dass ein anderes Programm die Ausgabe liest. Es ist für ein Programm viel einfacher, Daten zu lesen, bei denen es sich um einen Wert pro Zeile handelt, als zu versuchen, Spalten zu analysieren (da Dateinamen Leerzeichen enthalten können).ls -1
wenn Sie in eine Datei oder eine Pipe schreiben? Nein.quelle
Wenn ls weitergeleitet wird, kann ls nicht bestimmen, wie viele Spalten die Konsole tatsächlich enthält (unabhängig vom Befehl auf der rechten Seite). Dies geschieht also nach eigener Wahl, oder mit anderen Worten, dieses Verhalten ist instabil und kann sich in zukünftigen Versionen ändern.
Wurde im Gegensatz
ls -1
dazu zum Zählen oder Erstellen von Skripten im Allgemeinen erstellt, sodass das Verhalten stabil ist.quelle