GNU/Linux >> Linux の 問題 >  >> Linux

BASH で実行したプログラムのカラー出力

ほとんどの端末は、ASCII カラー シーケンスに従います。 ESC を出力することで機能します 、続いて [ 、次にセミコロンで区切られたカラー値のリスト、次に m .これらは一般的な値です:

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

"\033[31;47m" を出力します 端末の前面 (テキスト) の色を赤、背景の色を白にする必要があります。

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

stringstream を使用した、@nightcracker による上記のコードのバージョンを次に示します。 itoa の代わりに . (これは、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;
}

VT100 制御コードを参照してください。


Linux
  1. プログラムの出力をZipファイルにリダイレクトする方法は??

  2. Openbsdでの仮想化ソリューション?

  3. Rsync プロセスをバックグラウンドで実行する方法

  1. コマンドの出力をBashを使用して列ごとに分割しますか?

  2. bash で複数のバックグラウンド コマンドを 1 行で実行するにはどうすればよいですか?

  3. ログイン後に bash スクリプトを実行する

  1. 標準出力を閉じる(>&-)?

  2. 起動時にGUIプログラムを実行しますか?

  3. プログラムは、sudo の下で実行されていることを認識できますか?