bash - Farbwechselcodes

  • Ich habe ein Skript, das Escape-Codes zum Hervorheben von Textübereinstimmungen in seiner Ausgabe verwendet. Alles ist gut, außer wenn die Ausgabe zu less geleitet wird, wodurch die Escape-Codes

    ausgegeben werden, z. B.

     $ echo -e "\033[31m -- Hello World! -- \033[m"
     -- Hello World! --
     

    Zu less geleitet:

     $ echo -e "\033[31m -- Hello World! -- \033[m" | less
    ESC[31m -- Hello World! -- ESC[m
     

    Ich habe mich gefragt Wie andere Tools wie ls, grep usw. in Farbe ausgeben können, obwohl sie gut aussehen, wenn sie an less geleitet werden?

    22 November 2011
    armandino
4 answers
  • Verwenden Sie less -R oder fügen Sie LESS=-R zur Umgebung hinzu. Dies erfordert, dass less einige Escape-Sequenzen (z. B. Farbe) an das Terminal weitergibt, anstatt sie als normale Zeichen zu drucken.

    22 November 2011
    ephemient
  • grep and friends erkennen, ob die Ausgabe an ein Terminal erfolgt. Wenn nicht mehr weitergeleitet wird, ist dies nicht der Fall. Daher wird die Farbgebung deaktiviert.

    Überprüfen Sie mit isatty, ob die Ausgabe ein Terminal ist.

    Beachten Sie, dass ich das manchmal ziemlich nervig finde, weil ich weniger die Farben anzeigen soll :

     alias less='less -SR'
    alias grep='grep --color=always'
     

    Siehe auch ANSIFilter für das Umgekehrte: Um ANSI-Escape-Codes aus vorhandenen Streams zu filtern (Sie können damit auch HTML, RTF und möglicherweise andere Formate daraus erzeugen)

    22 November 2011
    sehecw.prime
  • Die meisten der von Ihnen genannten Tools nennen die C-Funktion isatty (), die bestimmt, ob der relevante Dateideskriptor (in diesem Fall stdout) des Prozesses an ein Terminal gesendet wird >

    Wenn die Ausgabe für ein Terminal ist, werden Farbe, Hervorhebungen, Pieptöne oder andere Funktionen aktiviert, von denen der Benutzer der Meinung ist, dass ein menschlicher Benutzer einen Wert daraus ziehen würde. Wenn kein Terminal vorhanden ist, geben sie rohen Text für die Verdauung anderer Werkzeuge aus.

    Wenn Sie schreiben

     grep -v "Dogs" list-of-animals | less
     

    Der isatty () - Aufruf von grep wird auf dem Dateideskriptor ausgeführt, der zur Pipe führt, nicht auf Ihrem Terminal. Es gibt also Null zurück, errno ist auf EINVAL oder ENOTTY gesetzt und grep gibt rohen Text aus, der für weniger geeignet ist.

    22 November 2011
    tialaramex
  • Wenn Sie weniger Farbwechselsequenzen an das Terminal übergeben möchten:

    > echo -e "\033[31m -- Hello World! -- \033[m" | less -R

    ... oder wenn Sie alle Escape-Sequenzen übergeben möchten:

    > echo -e "\033[31m -- Hello World! -- \033[m" | less -r

    22 November 2011
    Ben James