GNU/Linux >> Linux Esercitazione >  >> Linux

Output a colori del programma eseguito in BASH

La maggior parte dei terminali rispetta le sequenze di colori ASCII. Funzionano emettendo ESC , seguito da [ , quindi un elenco di valori di colore separati da punto e virgola, quindi m . Questi sono valori comuni:

Special
0  Reset all attributes
1  Bright
2  Dim
4  Underscore   
5  Blink
7  Reverse
8  Hidden

Foreground colors
30  Black
31  Red
32  Green
33  Yellow
34  Blue
35  Magenta
36  Cyan
37  White

Background colors
40  Black
41  Red
42  Green
43  Yellow
44  Blue
45  Magenta
46  Cyan
47  White

Quindi emettendo "\033[31;47m" dovrebbe rendere la parte anteriore del terminale (testo) di colore rosso e il colore di sfondo bianco.

Puoi avvolgerlo bene in una forma C++:

enum Color {
    NONE = 0,
    BLACK, RED, GREEN,
    YELLOW, BLUE, MAGENTA,
    CYAN, WHITE
}

std::string set_color(Color foreground = 0, Color background = 0) {
    char num_s[3];
    std::string s = "\033[";

    if (!foreground && ! background) s += "0"; // reset colors if no params

    if (foreground) {
        itoa(29 + foreground, num_s, 10);
        s += num_s;

        if (background) s += ";";
    }

    if (background) {
        itoa(39 + background, num_s, 10);
        s += num_s;
    }

    return s + "m";
}

Ecco una versione del codice sopra da @nightcracker, usando stringstream invece di itoa . (Funziona usando clang++, C++11, OS X 10.7, iTerm2, bash)

#include <iostream>
#include <string>
#include <sstream>

enum Color
{
    NONE = 0,
    BLACK, RED, GREEN,
    YELLOW, BLUE, MAGENTA,
    CYAN, WHITE
};

static std::string set_color(Color foreground = NONE, Color background = NONE)
{
    std::stringstream s;
    s << "\033[";
    if (!foreground && ! background){
        s << "0"; // reset colors if no params
    }
    if (foreground) {
        s << 29 + foreground;
        if (background) s << ";";
    }
    if (background) {
        s << 39 + background;
    }
    s << "m";
    return s.str();
}

int main(int agrc, char* argv[])
{
    std::cout << "These words should be colored [ " <<
        set_color(RED) << "red " <<
        set_color(GREEN) << "green " <<
        set_color(BLUE) << "blue" <<
        set_color() <<  " ]" << 
        std::endl;
    return EXIT_SUCCESS;
}

Potresti voler guardare i codici di controllo VT100.


Linux
  1. Come eseguire il processo Rsync in background

  2. Esegui processo con output in tempo reale in PHP

  3. Eseguire un programma Java nel backend

  4. Esegui lo script bash come demone

  5. Esegui lo script bash dopo il login

Bash:Scrivi su file

Come eseguire i comandi Linux in background

Come eseguire uno script Bash

Modi brillanti su come eseguire un programma in Linux

Come scrivere ed eseguire un programma C in Linux

Come eseguo più comandi in background in bash in una singola riga?