web-dev-qa-db-fra.com

Comment vérifier si Bash peut imprimer des couleurs

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

64
Angelo Vargas

Cela devrait suffire:

$ tput colors

couleurs de tput expliquées:

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.

Autres moyens utiles:

  • En C, vous pouvez simplement utiliser ISATTY et voir s'il s'agit d'un TTY
  • Voir si c'est un terminal muet à la recherche de $ à terme une variable à terme

À votre santé

25
D4RIO

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
5
Stefan Lasiewski

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

3
geekosaur

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

1
Šimon Tóth