Je veux savoir s'il y a un moyen de vérifier si mon programme peut produire une sortie de terminal à l'aide de couleurs ou non.
Commandes en cours comme less
et en regardant la sortie à partir d'un programme qui génère à l'aide de couleurs, la sortie est affichée incorrecte, comme
[ESC[0;32m0.052ESC[0m ESC[1;32m2,816.00 kbESC[0m]
Merci
Cela devrait suffire:
$ tput colors
Si vous regardez le manuel, vous remarquez ceci:
SYNOPSIS
tput [-Ttype] capname [parms ... ]
Et...
capname
indicates the capability from the terminfo database. When term‐
cap support is compiled in, the termcap name for the capability
is also accepted.
Le TermCap colors
est dans la base de données TerminFo, vous pouvez donc la demander. Si vous avez un statut de sortie zéro, le TermCap est compilé. Mais si vous avez quelque chose comme:
$ tput unknowntermcap
tput: unknown terminfo capability 'unknowntermcap'
$ echo $?
4
Cela montre que l'inconnu est n'existe pas. Donc ça:
$ tput colors
8
$ echo $?
0
Montre que votre commande avait raison.
À votre santé
L'idée est que j'ai pour ma demande de savoir de ne pas colorer la sortie si le programme ne peut pas imprimer, par exemple, de connecter la sortie de l'intermédiaire d'un travail cron dans un fichier, pas besoin de vous connecter la sortie colorée, mais lorsque vous courez manuellement, j'aime voir la sortie colorée.
Pour ce cas d'utilisation, quels programmes font généralement (par exemple GNU ls ou GNU grep avec --color=auto
) Est d'utiliser des couleurs si leur sortie va sur un terminal et Pas de couleurs sinon. Les terminaux qui ne prennent pas en charge les séquences de changement de couleur ANSI sont suffisamment rares qu'il est acceptable de rendre leurs utilisateurs remplacent le choix par défaut. En tout état de cause, assurez-vous que votre application a une option pour forcer les couleurs sur ou éteindre.
Dans un script shell, utilisez [ -t 1 ]
Pour tester si la sortie standard est un terminal.
# 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
À partir d'un programme utilisant l'API C, appelez 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);
Commandes en cours d'exécution comme moins et en examinant la sortie d'un programme qui résulte de couleurs, la sortie est affichée, comme
[ESC [0; 32M0.052ESC [0M ESC [1; 32M2 816.00 KBESC [0M]
Essayez d'utiliser less --RAW-CONTROL-CHARS
.
Dans cet exemple, j'utilise logtool , qui imprime la sortie à l'aide de couleurs.
Sans --Rew-Control-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
Avec --Raw-Control-Char (Imaginez ceci est dans de jolies couleurs. En outre, je ne sais pas pourquoi ça ^G
est en cours d'affichage.):
$ head -20 /var/log/messages | logtool | less --RAW-CONTROL-CHARS
Mar 20 11:43:52 Host1 rsyslogd: ^Glast message repeated 14 times
Ce serait la faute de less
non mis à interpréter pour interpréter les échappements ANSI; Recherchez R
dans $LESSOPTS
. Pour déterminer si le système connaît votre terminal peut traiter des couleurs, tput colors
produira le nombre de couleurs qu'elle prend en charge ou -1
S'il ne supporte pas les couleurs. (Notez que certains terminaux peuvent utiliser xterm
au lieu de xterm-color
comme leur description du terminal, mais supporte toujours les couleurs.)
Si vous souhaitez ajouter de la couleur à la sortie, mais uniquement lorsque les couleurs sont prises en charge, vous pouvez simplement utiliser tput
. http://tldp.org/howto/bash-prompt-howto/x405.html