GNU/Linux >> Belajar Linux >  >> Linux

Output warna dari program dijalankan di bawah BASH

Sebagian besar terminal menghormati urutan warna ASCII. Mereka bekerja dengan mengeluarkan ESC , diikuti oleh [ , lalu daftar nilai warna yang dipisahkan titik koma, lalu m . Ini adalah nilai umum:

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

Jadi menghasilkan "\033[31;47m" harus membuat warna depan terminal (teks) merah dan warna latar belakang putih.

Anda dapat membungkusnya dengan baik dalam bentuk 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";
}

Ini adalah versi kode di atas dari @nightcracker, menggunakan stringstream bukannya itoa . (Ini berjalan menggunakan 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;
}

Anda mungkin ingin melihat kode kontrol VT100.


Linux
  1. Menutup Output Standar (>&-)?

  2. Solusi Virtualisasi Di Bawah Openbsd?

  3. Bagaimana menjalankan proses Rsync di latar belakang

  1. Jalankan proses dengan output realtime di PHP

  2. Menggunakan output dari perintah sebelumnya di bash

  3. Jalankan skrip bash sebagai daemon

  1. Pisahkan keluaran perintah dengan kolom menggunakan Bash?

  2. Jalankan program java di backend

  3. Bisakah sebuah program mengatakan sedang dijalankan di bawah sudo?