GNU/Linux >> Znalost Linux >  >> Linux

Barevný výstup programu běžícího pod BASH

Většina terminálů respektuje sekvence barev ASCII. Fungují na výstupu ESC a poté [ , pak středníkem oddělený seznam hodnot barev a poté m . Toto jsou běžné hodnoty:

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

Takže výstup "\033[31;47m" by měla být přední strana terminálu (text) červená a barva pozadí bílá.

Můžete to pěkně zabalit do formy 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";
}

Zde je verze kódu výše od @nightcracker s použitím stringstream místo itoa . (To běží pomocí 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;
}

Možná se budete chtít podívat na řídicí kódy VT100.


Linux
  1. Jak přesměrovat výstup programu do souboru ZIP?

  2. Zavření standardního výstupu (>&-)?

  3. Spustit program Gui při spuštění?

  1. Virtualizační řešení v rámci Openbsd?

  2. Rozdělit výstup příkazu podle sloupců pomocí Bash?

  3. Spusťte Java program v backendu

  1. Jak spustit proces Rsync na pozadí

  2. Spusťte příkaz bash na jenkins pipeline

  3. Může program zjistit, že je spuštěn pod sudo?