
Wenn ich ein Programm (zum Beispiel grep
oder ls
) ohne Pager ausführe, ist die Ausgabe farbig. Wenn ich es jedoch ausführe und die Ausgabe an weiterleite less
, werden keine Farben angezeigt.
Dieser Befehl gibt beispielsweise eine farbige Ausgabe aus:
grep -r something
aber das hier nicht:
grep -r something | less
Warum? Wie kann ich Farben durch sehen less
?
Antwort1
Hier gibt es zwei Probleme:
- Befehle wie
ls
—die die Farbunterstützung automatisch erkennen— finden keine Unterstützung durch Pipes less
ist standardmäßig so eingestellt, dass nur Farbcodes angezeigt werden.
Beides kann überwunden werden, ist aber etwas umständlich:
ls --color=always | less -R
Dies ist nicht ls
spezifisch. Viele Befehle, die Farbe unterstützen, haben auch ein Override-Argument.
Eine etwas ausführlichere Antwort besteht darin, ls
zu prüfen, ob sein STDOUT zu einem realen Terminal gehört oder nicht. Wenn Sie Dinge weiterleiten, wird der STDOUT auf den STDIN des nächsten Befehls gesetzt.
Das sieht man bei der Arbeitim ls
Quellcode. Es verwendet den isatty
Befehl (eine zentrale POSIX-Schnittstelle), um die Situation herauszufinden:
Sind Farben standardmäßig aktiviert:
print_with_color = (i == color_always || (i == color_if_tty && isatty (STDOUT_FILENO)));
Versuchen wir die Ausgabe in mehreren Spalten:
if (format == long_format) format = (isatty (STDOUT_FILENO) ? many_per_line : one_per_line); //... if (isatty (STDOUT_FILENO)) { format = many_per_line; set_quoting_style (NULL, shell_escape_quoting_style); qmark_funny_chars = true; } else { format = one_per_line; qmark_funny_chars = false; }
grep
macht etwas ganz Ähnliches, sofern es nicht ausdrücklich überschrieben wird. Es erkennt die Farbunterstützung mit isatty
:
color_option = isatty (STDOUT_FILENO) && should_colorize ();
Antwort2
Wenn Sie sich allgemeiner für Farben interessieren less
, sollten Sie sich ansehen lesspipe.sh
. Siehe zum Beispielhttps://github.com/wofr06/lesspipe.
lesspipe.sh ist ein Eingabefilter für den Pager less, wie in der Manpage von less beschrieben. Das Skript läuft unter einer ksh-kompatiblen Shell (z. B. bash, zsh) und ermöglicht Ihnen, mit less Dateien mit binärem Inhalt, komprimierte Dateien, Archive und in Archiven enthaltene Dateien anzuzeigen.
Es färbt auch Shell-Skripte, Perl-Skripte usw. ähnlich wie ein Texteditor, jedoch ohne die Verwendung eines „Vorverarbeitungsprogramms“ zum Einfärben.
Antwort3
Die Antwort von @oli setzt voraus, dass Sie in der Lage sind, dem Befehl, der die Farben erzeugt, entsprechende Flags bereitzustellen. Das kann schwierig sein, wenn Befehle in Skripten und dergleichen vergraben sind, und es muss herausgefunden werden, wie man geeignete Flags separat für verschiedene Befehle bereitstellt, die wissen, wie ANSI-Escapes erzeugt werden, wenn die Terminalumgebung dies zulässt.
Die Antwort von @DaveEmme besagt, dass Sie Lesspipe verwenden können, um die Ausgabe aus einer beliebigen Quelle einzufärben, aber soweit ich weiß, bleibt die Farbe von Befehlen, die sie bereits erzeugen, nicht erhalten, wenn die Ausgabe an das Terminal geht.
Wenn Sie bereits über einen Befehl verfügen, der in Ihrem Terminal einwandfrei funktioniert, ist es gut, diesen Befehl so ausführen zu können, dass Farb-Escapes unabhängig von der weitergeleiteten Ausgabe beibehalten werden, sodass Sie diese in einfügen können less -R
.
unbuffer
erledigt das für Sie. Unter Debian erhalten Sie es zumindest mit sudo apt install expect-dev
.
Sie können dann Folgendes tun:
unbuffer [command] |& less -R
Die Verwendung |&
anstelle von |
ist möglicherweise ein unnötiges Detail, bedeutet aber, dass STDERR sowohl an Less als auch an STDOUT weitergeleitet wird.
Dank anhttps://superuser.com/a/1260695/229226dafür.