web-dev-qa-db-ja.com

ANSI色固有のRGBシーケンスバッシュ

Bashターミナルでは、色を変更する信頼できる方法はANSIエスケープシーケンスを使用することです。例えば:

echo -e "\033[0;31mbrown text\033[0;00m"

出力する必要があります

brown text (in brown)

ANSIで特定のRGBセットを使用して色を出力する方法はありますか?明るい赤が欲しいと言う:

echo -e "**\033[255:0:0m**red text\033[0;00m"

この種のものは存在しますか?

標準のbashを使いたいだけです。

31
Blue Ice

これは存在しますが、OPが探していた16777216(256 ^ 3)色の代わりに、256色のより大きなセットに216(6 ^ 3)の均等に分散された色があります。例:

echo -e "\033[38;5;208mpeach\033[0;00m"

これは、楽しい種類の桃色のテキストを出力します。


このコマンドを分解:\ 033 [38; 5; 208m

\ 033はエスケープコードです。 [38;は、コマンドをフォアグラウンドに送ります。代わりに背景色を変更したい場合は、代わりに[48;を使用してください。 5;は、色が変化するシーケンスの一部です。そして、最も重要な部分208mは、実際の色を選択します。


このエスケープのための256色のシーケンスで見つけることができる色の3つのセットがあります。最初のセットは、基本的な「キャンディー」カラーセット、または0〜15の値です。次に、16〜231の分散色の立方体があります。最後に、232-255の詳細なグレースケールセットがあります。

これらのすべての値を含む表をここに見つけることができます: http://bitmote.com/index.php?post/2012/11/19/Using-ANSI-Color-Codes-to-Colorize-Your- Bash-Prompt-on-Linux#256%20(8-bit)%20Colors

44
Blue Ice

ここでの両方の回答では、8bpcカラーの TruecolorANSI support について言及していません。これにより、OPが最初に要求したRGBカラーが取得されます。

;5の代わりに;2を使用し、[〜#〜] r [〜#〜][を指定します〜#〜] g [〜#〜]、および[〜#〜] b [〜#〜]次の3つの値(0-255)制御セグメント。

\x1b[38;2;40;177;249m

テストするには 端末がTruecolorをサポートしている場合

printf "\x1b[38;2;40;177;249mTRUECOLOR\x1b[0m\n"

私のマシンでは、XTermは問題なく正しい色を出力しました。ただし、最新のRGBカラーより前の端末をモデルにした端末は、通常、トゥルーカラーをサポートしません。エスケープコードのこの特定のバリアントを使用する前に、ターゲットを確認してください。


38;5/;2-Blue Ice 言及38がルーティングしてから5色を変更します。それは少し間違っています。

38は、xterm-256の拡張前景カラーコードです。 30-37は、16色のフォアグラウンドコードです(明るさは、一部のシステムではエスケープコード1で制御され、引数としてサポートされている90-97によって制御されます)すべてのvt100/xterm準拠のカラー端末でサポートされている非標準の「明るい」コード)。

;2および;5は、色の形式を示し、最終的にプルするシーケンスの数を端末に伝えます。;5は、1つだけを必要とする8ビット形式を指定します(Blue Iceが言及)。より多くの制御セグメント、および3つの制御セグメントを必要とする完全な24ビットRGB形式を指定する;2

これらの拡張モードは技術的に「文書化されていない」ものであり、完全に実装定義されています。私が知り、調査できる限り、それらはANSI委員会の管理下にありません。


そのように傾斜した場合、5;(256色)形式は、元の16色(暗い/明るいの両方で30-37と90-97)から始まり、色0-15になります。

続く216色(16〜231)は、16だけオフセットされた3bpc RGB値によって形成され、単一の値にパックされます。

最後の24色(232〜256)は、黒よりわずかに明るい色合いから、白よりわずかに暗い色合いまでのグレースケールです。一部のエミュレータはこれらのステップを3つのチャネルすべてで(256 / 24)からの線形増分として解釈しますが、これらの値を明示的に定義していると思われるエミュレータに遭遇しました。

これは、すべての灰色を考慮に入れて、このような変換を実行するJavaScript関数です。

function rgbToAnsi256(r, g, b) {
    // we use the extended greyscale palette here, with the exception of
    // black and white. normal palette only has 4 greyscale shades.
    if (r === g && g === b) {
        if (r < 8) {
            return 16;
        }

        if (r > 248) {
            return 231;
        }

        return Math.round(((r - 8) / 247) * 24) + 232;
    }

    var ansi = 16
        + (36 * Math.round(r / 255 * 5))
        + (6 * Math.round(g / 255 * 5))
        + Math.round(b / 255 * 5);

    return ansi;
}

したがって、ある方法で、端末でプログラム的に行いたい場合に256エンコードされた値を形成するために、8ビットから3ビットに減らすことにより、初期RGB値から 計算 256 ANSIカラーを作成できます。 Truecolorはサポートされていません。

59
Qix

現在、トゥルーカラーエスケープシーケンス(\ e [38; 2; R; G; Bm)は、gnome-terminal(vte> = 0.36)、konsole、st [suckless]などの特定のターミナルエミュレータでサポートされています。

機能はnotです。 pterm [PuTTY]、用語[啓蒙]、urxvt。

xtermはその中間です。エスケープシーケンスは認識しますが、256色パレットで最も近い色にすべての色を丸めます。

2
egmont