283 votes

Comment puis-je afficher du texte en couleur sur un terminal Linux?

Comment imprimer des caractères colorés sur un terminal Linux qui le supporte? J'utilise C ++ pour ce programme, mais je pense que cela pourrait ne pas être pertinent.

EDIT: Et deuxièmement, comment savoir si elle prend en charge les codes de couleur?

382voto

Thomas Points 63635

Vous avez besoin à la sortie de la norme ANSI codes de couleur. Notez que toutes les bornes de charge ce; si la couleur de séquences ne sont pas pris en charge, les ordures s'affichera.

Exemple:

 cout << "\033[1;31mbold red text\033[0m\n";

Ici, \033 est le caractère ESC, ASCII 27. Elle est suivie par l' [, puis un ou deux nombres séparés par des ;, et enfin la lettre m. Voir le tableau sur Wikipédia pour le sens des nombres.


Edit: Pour déterminer si votre terminal prend en charge la couleur des séquences, la lecture de la valeur de l' TERM variable d'environnement. Il doit préciser le type de terminal utilisé (par exemple, vt100, gnome-terminal, xterm, screen, ...). Puis cherchez dans la base de données terminfo; vérifier l' colors de la capacité.

92voto

Joel Sjögren Points 684

Notions de base

J'ai écrit une classe C++ qui peuvent être utilisées pour mettre au premier plan et la couleur d'arrière-plan de la production. Cet exemple de programme est un exemple de l'imprimerie This ->word<- is red. et la mise en forme, de sorte que la couleur de premier plan word est rouge.

#include "colormod.h" // namespace Color
#include <iostream>
using namespace std;
int main() {
    Color::Modifier red(Color::FG_RED);
    Color::Modifier def(Color::FG_DEFAULT);
    cout << "This ->" << red << "word" << def << "<- is red." << endl;
}

Source

#include <ostream>
namespace Color {
    enum Code {
        FG_RED      = 31,
        FG_GREEN    = 32,
        FG_BLUE     = 34,
        FG_DEFAULT  = 39,
        BG_RED      = 41,
        BG_GREEN    = 42,
        BG_BLUE     = 44,
        BG_DEFAULT  = 49
    };
    class Modifier {
        Code code;
    public:
        Modifier(Code pCode) : code(pCode) {}
        friend std::ostream&
        operator<<(std::ostream& os, const Modifier& mod) {
            return os << "\033[" << mod.code << "m";
        }
    };
}

Avancé

Vous pouvez ajouter des fonctionnalités supplémentaires à la classe. Il est, par exemple, possible d'ajouter de la couleur magenta et même les styles de caractères gras. Pour ce faire, une autre entrée à l' Code énumération. C' est une bonne référence.

41voto

Alex Points 351

Avant d'aller à la sortie de n'importe quelle couleur, vous devez vous assurer que vous êtes dans un terminal:

[ -t 1 ] && echo 'Yes I am in a terminal'  # isatty(3) call in C

Alors vous devez vérifier que le terminal capacité si elle support couleur

sur les systèmes avec terminfo (basé sur Linux) , vous pouvez obtenir la quantité de prise en charge des couleurs comme

Number_Of_colors_Supported=$(tput colors)

sur les systèmes avec termcap (BSD) vous pouvez obtenir la quantité de prise en charge des couleurs comme

Number_Of_colors_Supported=$(tput Co)

Ensuite, assurez-vous de la décision:

[ ${Number_Of_colors_Supported} -ge 8 ] && {
    echo 'You are fine and can print colors'
} || {
    echo 'Terminal does not support color'
}

BTW, ne pas utiliser de colorant comme il a été suggéré avant avec ESC caractères. L'utilisation standard d'appel à la borne de la capacité qui vous attribue de CORRIGER les couleurs en particulier support de terminal.

Basées sur BSD

fg_black="$(tput AF 0)"
fg_red="$(tput AF 1)"
fg_green="$(tput AF 2)"
fg_yellow="$(tput AF 3)"
fg_blue="$(tput AF 4)"
fg_magenta="$(tput AF 5)"
fg_cyan="$(tput AF 6)"
fg_white="$(tput AF 7)"
reset="$(tput me)"

Basé Sur Linux

fg_black="$(tput setaf 0)"
fg_red="$(tput setaf 1)"
fg_green="$(tput setaf 2)"
fg_yellow="$(tput setaf 3)"
fg_blue="$(tput setaf 4)"
fg_magenta="$(tput setaf 5)"
fg_cyan="$(tput setaf 6)"
fg_white="$(tput setaf 7)"
reset="$(tput sgr0)"

Utilisation En Tant Que

echo -e "${fg_red}  Red  ${fg_green} Bull ${reset}"

12voto

Christos L. Points 71

C'est un vieux sujet, mais j'ai écrit une classe imbriquée avec les sous-classes membres statiques et pour les couleurs définies par simple C macros.

J'ai eu l' color fonction de ce post, la Couleur du Texte Dans la Programmation en C dans dreamincode.net par l'utilisateur no2pencil.

Je l'ai fait de cette manière afin d'être en mesure d'utiliser les constantes statiques dans std::cout stream comme ceci:

cout << zkr::cc::fore::red << "This is red text. " 
     << zkr::cc::console << "And changing to console default colors, fg, bg."
     << endl;

La classe et un programme de test de code source peut être téléchargé ici.

cc::console sera remis à la console par défaut les couleurs et les attributs, cc::underline va souligner le texte, qui fonctionne sur le mastic que j'ai testé le programme de test.

Couleurs:

black
blue
red
magenta
green
cyan
yellow
white

lightblack
lightblue
lightred
lightmagenta
lightgreen
lightcyan
lightyellow
lightwhite

Qui peut être utilisé à la fois avec fore et back statique de la sous-classes de la cc statique de la classe.

9voto

Vlad Points 23480

Vous pouvez utiliser des séquences d'échappement si votre terminal le prend en charge. Par exemple:

 echo \[\033[32m\]Hello, \[\033[36m\]colourful \[\033[33mworld!\033[0m\]
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X