Wie mache ich weniger Ausgabefarben?

25

Wenn ich ein Programm (zum Beispiel grepoder ls) ohne Pager ausführe , ist die Ausgabe farbig. Wenn ich es jedoch laufen lasse less, werden keine Farben gezeigt.

Der folgende Befehl gibt beispielsweise eine farbige Ausgabe aus:

grep -r something

aber das tut es nicht:

grep -r something | less

Warum? Wie kann ich Farben durchschauen less?

Mohammad Reza Rezwani
quelle
5
grep --color=always "search string" * | less -Raber ich neige dazu, mostheutzutage statt zu verwenden less. AUCH: gnu.org/software/src-highlite ist ein farbiger Textmarker (funktioniert auch weniger)
Rinzwind
@alex hast du installiert python-pygments?
Souravc
@souravc nein, ich habe das nicht installiert
Mohammad Reza Rezwani
@ales mich zu ignorieren sind wir? >: - D
Rinzwind

Antworten:

36

Hier gibt es zwei Probleme:

  • Befehle wie ls- die die Farbunterstützung automatisch erkennen - werden von Pipes nicht unterstützt
  • less ist standardmäßig so eingestellt, dass nur Farbcodes angezeigt werden.

Beide können überwunden werden, aber es ist ein bisschen klobig:

ls --color=always | less -R

Das ist nicht lsspezifisch. Viele Befehle, die Farbe unterstützen, haben auch ein Überschreibungsargument.


Eine etwas ausführlichere Antwort besteht darin, zu lsprüfen, ob sein STDOUT zu einem realen Terminal gehört oder nicht. Wenn Sie Dinge umleiten, wird das STDOUT auf das STDIN des nächsten Befehls gesetzt.

Sie können dies bei der Arbeit im lsQuellcode sehen . Es verwendet den isattyBefehl (eine POSIX-Kernschnittstelle), um die Situation zu ermitteln:

  • Sind die Farben standardmäßig aktiviert ?:

        print_with_color = (i == color_always
                            || (i == color_if_tty
                                && isatty (STDOUT_FILENO)));
    
  • Versuchen wir, in mehreren Spalten auszugeben:

    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;
      }
    

grephat eine sehr ähnliche Sache, sofern nicht ausdrücklich außer Kraft gesetzt, wird es Farbunterstützung erkennen, mit isatty:

color_option = isatty (STDOUT_FILENO) && should_colorize ();
Oli
quelle
1
Meine letzte Aufwertung (hat das Limit erreicht) für heute, um dich für 100k zu unterstützen. Aber ich und Rinzwind wollen Kuchen, wenn das passiert.
Hytromo
Ich habe ein Programm mit dem Namen ack-grep heruntergeladen. Wenn Sie ack-grep foo eingeben, wird in allen Unterverzeichnissen nach foo gesucht weniger und die Farben verschwunden. Aber anscheinend unterstützt dieses Programm nicht "--color = always", egal, danke für die Hilfe
Mohammad Reza Rezwani
1
@alex ack hat ein --colorArgument:ack-grep -i select --color | less -R
Oli
@Oli ......... Oh mein Gott ........ das einzige, was ich über dein Wissen und deine Hilfe und auch die Macht von Linux sagen kann
Mohammad Reza Rezwani
1
@ B1KMusic Ich stimme zu. Ich stimme so sehr zu, dass ich herausgefunden habe, wie es funktioniert, und die Antwort aktualisiert habe. Sie können Spalten mit einem -CArgument erzwingen .
Oli
2

Wenn Sie sich lessallgemein für Farben interessieren , sollten Sie sich diese ansehen lesspipe.sh. Siehe zum Beispiel http://freecode.com/projects/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 es Ihnen, Dateien mit binärem Inhalt, komprimierten Dateien, Archiven und in Archiven enthaltenen Dateien mit weniger Aufwand anzuzeigen.

Es koloriert auch Shell-Skripte, Perl-Skripte usw. ähnlich einem Texteditor, jedoch ohne die Verwendung eines "Vorverarbeitungs" -Programms, um die Kolorierung durchzuführen.

DaveEmme
quelle