Wie erreiche ich „weniger“ Ausgabefarben?

Wie erreiche ich „weniger“ Ausgabefarben?

Wenn ich ein Programm (zum Beispiel grepoder 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
  • lessist 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 lsspezifisch. Viele Befehle, die Farbe unterstützen, haben auch ein Override-Argument.


Eine etwas ausführlichere Antwort besteht darin, lszu 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 lsQuellcode. Es verwendet den isattyBefehl (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;
      }
    

grepmacht 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.

unbuffererledigt 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.

verwandte Informationen