GNU/Linux >> Linux Esercitazione >  >> Linux

Come eseguo l'output di testo colorato su un terminale Linux?

È necessario emettere i codici colore ANSI. Si noti che non tutti i terminali lo supportano; se le sequenze di colori non sono supportate, verrà visualizzata la spazzatura.

Esempio:

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

Qui, \033 è il carattere ESC, ASCII 27. È seguito da [ , quindi zero o più numeri separati da ; , e infine la lettera m . I numeri descrivono il colore e il formato a cui passare da quel momento in poi.

I codici per i colori di primo piano e di sfondo sono:

         foreground background
black        30         40
red          31         41
green        32         42
yellow       33         43
blue         34         44
magenta      35         45
cyan         36         46
white        37         47

Inoltre, puoi usare questi:

reset             0  (everything back to normal)
bold/bright       1  (often a brighter shade of the same colour)
underline         4
inverse           7  (swap foreground and background colours)
bold/bright off  21
underline off    24
inverse off      27

Consulta la tabella su Wikipedia per altri codici meno ampiamente supportati.

Per determinare se il tuo terminale supporta sequenze di colori, leggi il valore di TERM variabile d'ambiente. Dovrebbe specificare il particolare tipo di terminale utilizzato (ad es. vt100 , gnome-terminal , xterm , screen , ...). Quindi cercalo nel database terminfo; controlla il colors capacità.


Prima di produrre qualsiasi colore di cui hai bisogno, assicurati di essere in un terminale:

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

Quindi devi verificare la capacità del terminale se supporta il colore

su sistemi con terminfo (basato su Linux) puoi ottenere la quantità di colori supportati come

Number_Of_colors_Supported=$(tput colors)

su sistemi con termcap (basato su BSD) puoi ottenere la quantità di colori supportati come

Number_Of_colors_Supported=$(tput Co)

Allora prendi la tua decisione:

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

A proposito, non usare la colorazione come suggerito in precedenza con i caratteri ESC. Usa la funzionalità di chiamata standard al terminale che ti assegnerà i colori CORRETTI che quel particolare terminale supporta.

Basato su 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)"
Basato su 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)"
Usa come
echo -e "${fg_red}  Red  ${fg_green} Bull ${reset}"

Nozioni di base

Ho scritto una classe C++ che può essere utilizzata per impostare il colore di primo piano e di sfondo dell'output. Questo programma di esempio serve come esempio di stampa di This ->word<- is red. e formattandolo in modo che il colore di primo piano di word è rosso.

#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;
}

Fonte

#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";
        }
    };
}

Avanzate

Potresti voler aggiungere ulteriori funzionalità alla classe. È, ad esempio, possibile aggiungere il colore magenta e persino stili come grassetto . Per fare questo basta inserire un'altra voce nel Code enumerazione. Questo è un buon riferimento.


Linux
  1. Come aggiungere testo alla fine del file in Linux

  2. Come assegnare l'output di un comando Linux a una variabile

  3. Come salvare l'output dei comandi in un file in Linux

  4. Come fa un programma a decidere se avere o meno stampe a colori?

  5. come controllare la versione di Linux X11?

Come aprire una finestra di un terminale Linux

Come salvare l'output del comando in un file utilizzando il terminale Linux

Come confrontare due file nel terminale Linux

Come aprire un PDF in un terminale Linux

Bash Scripting:come generare e formattare il testo su Linux Shell

Hardware del terminale di testo (per Linux)