So prüfen Sie, ob bash Farben drucken kann

62

Ich möchte wissen, ob es eine Möglichkeit gibt, zu überprüfen, ob mein Programm Terminalausgaben mit Farben ausgeben kann oder nicht.

Wenn Sie Befehle wie ausführen lessund die Ausgabe eines Programms betrachten, das mit Farben ausgibt, wird die Ausgabe wie falsch angezeigt

[ESC[0;32m0.052ESC[0m ESC[1;32m2,816.00 kbESC[0m]

Vielen Dank

Angelo Vargas
quelle

Antworten:

68

Die Idee ist, dass meine Anwendung weiß, dass sie die Ausgabe nicht einfärbt, wenn das Programm beispielsweise die Ausgabe von einem Cron-Job in eine Datei nicht drucken kann die Ausgabe farbig

In welcher Sprache verfassen Sie Ihre Bewerbung?

Der normale Ansatz besteht darin, zu überprüfen, ob das Ausgabegerät ein tty ist, und zu überprüfen, ob dieser Terminaltyp Farben unterstützt.

In bash, sieht das wäre wie

# check if stdout is a terminal...
if test -t 1; then

    # see if it supports colors...
    ncolors=$(tput colors)

    if test -n "$ncolors" && test $ncolors -ge 8; then
        bold="$(tput bold)"
        underline="$(tput smul)"
        standout="$(tput smso)"
        normal="$(tput sgr0)"
        black="$(tput setaf 0)"
        red="$(tput setaf 1)"
        green="$(tput setaf 2)"
        yellow="$(tput setaf 3)"
        blue="$(tput setaf 4)"
        magenta="$(tput setaf 5)"
        cyan="$(tput setaf 6)"
        white="$(tput setaf 7)"
    fi
fi

echo "${red}error${normal}"
echo "${green}success${normal}"

echo "${green}0.052${normal} ${bold}${green}2,816.00 kb${normal}"
# etc.

In C müssen Sie viel mehr tippen , können aber mit isatty und den in aufgeführten Funktionen dasselbe Ergebnis erzielen man 3 terminfo.

Mikel
quelle
^^ das ^^ war genau das wonach ich gesucht habe. Vielen Dank.
Tim Kennedy
Danke für den Hinweis zu tput. Das ist eine wirklich gute Antwort.
AmadeusDrZaius
24

Das sollte reichen:

$ tput colors

tput Farben erklärt:

Wenn Sie sich die Manpage ansehen, werden Sie Folgendes bemerken:

SYNOPSIS
       tput [-Ttype] capname [parms ... ]

Und...

   capname
          indicates the capability from the terminfo database.  When term
          cap  support is compiled in, the termcap name for the capability
          is also accepted.

Das Termcap colorsbefindet sich in der terminfo-Datenbank, daher können Sie danach fragen. Wenn Sie einen Exit-Status von Null haben, wird das Termcap in kompiliert. Wenn Sie jedoch Folgendes haben:

$ tput unknowntermcap
tput: unknown terminfo capability 'unknowntermcap'
$ echo $?
4

Dies zeigt, dass es keine Unknowntermcap gibt. Also das:

$ tput colors
8
$ echo $?
0

Zeigt an, dass Ihr Befehl richtig war.

Andere nützliche Möglichkeiten:

  • In C können Sie einfach isatty verwenden und sehen, ob es ein TTY ist
  • Überprüfen Sie, ob es sich um eine dumme $ TERM-Variable handelt

Prost

D4RIO
quelle
colorsist nicht in der tputManpage (!) dokumentiert , sollte ich also nach einer Zahl> = 8 in stdout oder einem Rückkehrcode von 0 suchen?
l0b0
Schien offensichtlich, aber Ihr Kommentar zeigt, dass es nicht so ist. Ich
füge
1
Die colorsFähigkeit ist in terminfo (5) dokumentiert . Tests mit tput -T dumb colors, tput -T vt220 colors, tput -T linux colors, tput -T xterm colorsdeutet darauf hin , gemeinsame Werte sind -1(keine Farbunterstützung) und 8(8 Farben). Beachten Sie, dass dies nur gilt, wenn überprüft wurde, ob das Ausgabegerät ein Terminal ist (z . B. [ -t 1 ]oder isatty).
Mikel
Beachten Sie, dass tput colorszurückgegeben wird, was die lokale Terminaldatenbank vom Terminal hält. Dies kann oder kann nicht dem entsprechen, was das Terminal tatsächlich kann, insbesondere für einen Terminaltyp, xtermder in vielen Varianten (von Schwarzweiß bis 256 Farben) erhältlich ist.
Gilles 'SO - hör auf, böse zu sein'
7

Die Idee ist, dass meine Anwendung weiß, dass sie die Ausgabe nicht einfärbt, wenn das Programm beispielsweise die Ausgabe von einem Cron-Job in eine Datei nicht drucken kann die Ausgabe farbig.

In diesem Anwendungsfall verwenden Programme (z. B. GNU ls oder GNU grep --color=auto) normalerweise Farben, wenn ihre Ausgabe an ein Terminal gesendet wird, und keine Farben, wenn sie nicht ausgegeben werden. Terminals, die keine ANSI-Farbänderungssequenzen unterstützen, sind selten genug, um zuzulassen, dass ihre Benutzer die Standardauswahl überschreiben. Stellen Sie in jedem Fall sicher, dass in Ihrer Anwendung die Option zum Aktivieren oder Deaktivieren von Farben verfügbar ist.

[ -t 1 ]Testen Sie in einem Shell-Skript, ob es sich bei der Standardausgabe um ein Terminal handelt.

# option processing has set $color to yes, no or auto
if [ $color = auto ]; then
  if [ -t 1 ]; then color=yes; else color=no; fi
fi

Rufen Sie in einem Programm, das die C-API verwendet, auf isatty(1).

# option processing has set use_color to 0 for no, 1 for yes or 2 for auto
if (use_color == 2) use_color = isatty(1);
Gilles 'SO - hör auf böse zu sein'
quelle
5

Wenn Sie Befehle wie less ausführen und die Ausgabe eines Programms betrachten, das mit Farben ausgibt, wird die Ausgabe wie falsch angezeigt

[ESC [0; 32m0,052ESC [0m ESC [1; 32m2,816.00 kbESC [0m]]

Versuchen Sie es mit less --RAW-CONTROL-CHARS.

In diesem Beispiel verwende ich logtool , das die Ausgabe mit Farben druckt.

Ohne --ZIEHEN-KONTROLL-CHARS:

$ head -20 /var/log/messages | logtool | less
ESC[0mESC[0;37mMar 20 11:43:52ESC[0mESC[1;36m host1ESC[0mESC[0;37m rsyslogd:ESC[0m ^GESC[0;31mlast message repeated 14 timesESC[0mESC[0m

Mit --RAW-CONTROL-CHAR (Stellen Sie sich vor, dies ist in hübschen Farben. Außerdem bin ich mir nicht sicher, warum das ^Gangezeigt wird.):

$ head -20 /var/log/messages | logtool | less --RAW-CONTROL-CHARS
Mar 20 11:43:52 host1 rsyslogd: ^Glast message repeated 14 times
Stefan Lasiewski
quelle
2

Das wäre der Fehler less, dass ANSI-Escapes nicht interpretiert werden; schau nach Rin $LESSOPTS. Um festzustellen, ob das System weiß, dass Ihr Terminal mit Farben umgehen kann, tput colorswird entweder die Anzahl der unterstützten Farben ausgegeben oder -1ob es keine Farben unterstützt. (Beachten Sie, dass einige Terminals möglicherweise xtermanstelle der xterm-colorTerminalbeschreibung verwenden, aber weiterhin Farben unterstützen.)

Geekosaurier
quelle
Die Idee ist, dass meine Anwendung weiß, dass sie die Ausgabe nicht einfärbt, wenn das Programm beispielsweise die Ausgabe von einem Cron-Job in eine Datei nicht drucken kann die Ausgabe farbig.
Angelo Vargas