Keine farbige Ausgabe in weniger für den Befehl ls


21

Wenn ich laufe, lserhalte ich eine farbige Ausgabe, die ich ziemlich praktisch finde, um schnell einen Blick auf die Art der Datei zu werfen. Wenn ich versuche, es lessauch mit den -rund -R-Flaggen zu pfeifen, geht die Färbung immer verloren. Ich benutze zshVersion 5.0.7. Irgendwelche Ideen? Vielen Dank.

Bearbeiten: Ich bin auf OS X.


Können Sie bestätigen, lsdass mit aufgerufen wird --color? Versuchen Sie, die Pipeline ( ^Z) anzuhalten oder psvon einem anderen Terminal aus zu verwenden. Welche Ausgabe which lsproduziert?
Zackse

Ich räumte dies aus der Nähe Warteschlange seit der OP deutlich erklärt hat , dass sie verwenden , less -rso dass es kein Problem mit ist lessaber mitls
terdon

Ich bin überrascht, dass dies noch kein Duplikat ist, aber das nächste, was ich finden konnte, war die Ausgabe des Befehls "Speichern" in Variablen , und das ist Super User.
Scott,

@Scott Ich bin mir nicht sicher, ob es ein genaues Duplikat gibt, aber es gibt einige Fragen, bei denen die Antwort sehr ähnlich ist (das lsErgebnis hängt von stdout ab). Der, an den ich mich erinnere, ist unix.stackexchange.com/questions/157285/…, der selbst als Duplikat von unix.stackexchange.com/questions/10421/…
jimmij 18.02.15

@jimmij In diesen Fragen wird jedoch nicht erwähnt, dass ls --color=autoFarben nur beim Schreiben in ein Terminal verwendet werden (dh wenn die Standardausgabe ein Terminal ist) und nicht, wenn es sich um eine Datei oder eine Pipe handelt.
Scott

Antworten:


21

Dies ist beabsichtigt: Programme, die eine farbige Ausgabe erzeugen, tun dies normalerweise nur, wenn ihre Ausgabe an ein Terminal gesendet wird, nicht, wenn sie an eine Pipe oder eine reguläre Datei gesendet wird. Der Grund dafür ist, dass Daten, die auf einem Terminal gesendet werden, vermutlich von einem Menschen gelesen werden, wohingegen Daten, die an ein Programm weitergeleitet oder in eine Datei geschrieben werden, wahrscheinlich von einem Programm analysiert werden, sodass sie keine fremden Inhalte wie farbverändernde Escape-Sequenzen enthalten sollten .

GNU lszeigt eine farbige Ausgabe auf einem Terminal an, wenn Sie die Option --color(oder --color=auto) übergeben. Übergeben Sie --color=alwaysoder --color=yes(Synonyme), um eine farbige Ausgabe unabhängig vom Dateityp der Standardausgabe zu erzwingen . Dieser Konvention sind andere Befehle gefolgt, wie GNU grep, FreeBSD grep git diffusw.

ls --colors=yes -l | less

Übergeben Sie mit der FreeBSD-Version von ls(ebenfalls unter OSX verfügbar und als colorlsPort unter OpenBSD und NetBSD verfügbar ) die Option -G, Farben anzuzeigen, wenn die Ausgabe ein Terminal ist. Stellen Sie die Umgebung so ein CLICOLOR_FORCE, dass Farben unabhängig vom Ausgabedateityp angezeigt werden.

CLICOLOR_FORCE=1 ls -l | less

20

Das Problem ist höchstwahrscheinlich, dass Ihr lsProgramm die Option set hat, --color=autowas im Grunde bedeutet, dass die Ausgabe nur dann eingefärbt werden sollte, wenn sie an ein Terminal angeschlossen ist. Andernfalls (Ausgabe an eine Pipe oder eine Datei) werden keine Farben ausgegeben.

Wenn Sie in solchen Fällen Farben möchten, sollten Sie die --colorOption auf setzen always. Versuchen Sie es also

ls --color=always | less -R

Wenn Sie dieses Verhalten die ganze Zeit erwarten, erstellen Sie einfach einen Alias:

alias ls='ls --color=always'

In meinem Setup ist die Bash-Version 4.3, --color eine unzulässige Option. Wenn ich nach "Farbe" greife, erfahre ich mehr über die Option "-G", aber nicht über eine automatische oder immer verfügbare Option. Irgendwelche Ideen?
Nunos

5
@nunos lskommt nicht von bash, es ist ein eigenständiges Programm. Führen Sie ls --versionden Befehl aus, um die Version zu überprüfen. Meins ist ls GNU coreutils) 8.21 .
Jimmy

@jimiij meine lsVersion hat die --versionFlagge nicht. Ich verwende die Standardversion von OS X und bin mir nicht sicher, ob das hilft.
Nunos

@nunos Bitte geben Sie immer Ihr Betriebssystem an. Es gibt große Unterschiede zwischen Linux- und Nicht-GNU-Nixen wie OSX.
terdon

0

Ich kann die Antwort von @jimmij nicht kommentieren, da ich weniger als 50 Wiederholungen habe, aber ich möchte erklären, was bei mir in Bash funktioniert hat.

Wenn du läufst

$ man ls | grep color

Sie sehen alle Einträge der man-Seite für Ihre spezielle Shell-Umgebung (in unserem Fall bash).

Für mich hat die folgende Anpassung den Trick gemacht:

$ alias ls='ls -G'

3
Das hat für was funktioniert? Die -GFlagge hat nichts damit zu tun, wie die lsFarbausgabe verwaltet wird. Dadurch werden nur die Gruppen aus der Ausgabe von entfernt ls -l. Es wirkt sich auf die Farbausgabe in BSD ls aus (die auch unter OSX verwendet wird), meinen Sie das? Auf jeden Fall glaube ich nicht, dass dies Farbe zeigt, wenn es in eine Datei umgeleitet wird, sondern nur Farbe in der Befehlszeile.
terdon
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.