tput setafカラーテーブル?カラーコードの決定方法は?


79

私は自分の端末の色付けをしていPS1ます。

を使用して色変数を設定していtputます。たとえば、紫色は次のとおりです。

PURPLE=$(tput setaf 125)

質問:

125他の色の色コード(例)を見つけるにはどうすればよいですか?

カラーテーブルガイド/チートシートはどこかにありますか?

125がわからないのですか…16進数の色を使用して、setaf使用可能な数値に変換する方法はありますか?


回答:


153

tputで使用できる色の数は、によって与えられtput colorsます。

基本的な8色(setfurxvtターミナルおよびsetafxtermターミナルで使用される)を表示するには:

$ printf '\e[%sm▒' {30..37} 0; echo           ### foreground
$ printf '\e[%sm ' {40..47} 0; echo           ### background

通常、次のように名前が付けられます。

Color       #define       Value       RGB
black     COLOR_BLACK       0     0, 0, 0
red       COLOR_RED         1     max,0,0
green     COLOR_GREEN       2     0,max,0
yellow    COLOR_YELLOW      3     max,max,0
blue      COLOR_BLUE        4     0,0,max
magenta   COLOR_MAGENTA     5     max,0,max
cyan      COLOR_CYAN        6     0,max,max
white     COLOR_WHITE       7     max,max,max

拡張256色(setafurxvtで使用される)を表示するには:

$ printf '\e[48;5;%dm ' {0..255}; printf '\e[0m \n'

数字と順序付けされた出力が必要な場合:

#!/bin/bash
color(){
    for c; do
        printf '\e[48;5;%dm%03d' $c $c
    done
    printf '\e[0m \n'
}

IFS=$' \t\n'
color {0..15}
for ((i=0;i<6;i++)); do
    color $(seq $((i*36+16)) $((i*36+51)))
done
color {232..255}

インデックスでラベル付けされた256色のチャート


1600万色にはかなりのコードが必要です(一部のコンソールではこれを表示できません)。
基本は次のとおりです。

fb=3;r=255;g=1;b=1;printf '\e[0;%s8;2;%s;%s;%sm▒▒▒ ' "$fb" "$r" "$g" "$b"

fbですfront/back3/4

非常に多くの色を表示するためのコンソール容量の簡単なテストは次のとおりです。

for r in {200..255..5}; do fb=4;g=1;b=1;printf '\e[0;%s8;2;%s;%s;%sm   ' "$fb" "$r" "$g" "$b"; done; echo

赤い線、暗い色から明るい色へのフェード(左から右) 左から右へのトーンの変化が非常に小さい赤い線が表示されます。その小さな変化が見える場合、コンソールは1600万色に対応しています。

それぞれrg、と bRGB(赤、緑、青)について0から255までの値です。

コンソールタイプがこれをサポートしている場合、このコードはカラーテーブルを作成します。

mode2header(){
    #### For 16 Million colors use \e[0;38;2;R;G;Bm each RGB is {0..255}
    printf '\e[mR\n' # reset the colors.
    printf '\n\e[m%59s\n' "Some samples of colors for r;g;b. Each one may be 000..255"
    printf '\e[m%59s\n'   "for the ansi option: \e[0;38;2;r;g;bm or \e[0;48;2;r;g;bm :"
}
mode2colors(){
    # foreground or background (only 3 or 4 are accepted)
    local fb="$1"
    [[ $fb != 3 ]] && fb=4
    local samples=(0 63 127 191 255)
    for         r in "${samples[@]}"; do
        for     g in "${samples[@]}"; do
            for b in "${samples[@]}"; do
                printf '\e[0;%s8;2;%s;%s;%sm%03d;%03d;%03d ' "$fb" "$r" "$g" "$b" "$r" "$g" "$b"
            done; printf '\e[m\n'
        done; printf '\e[m'
    done; printf '\e[mReset\n'
}
mode2header
mode2colors 3
mode2colors 4

インデックスとしてラベルを使用したサンプルの前景色のグラフ

ラベルとしてインデックスを使用したサンプルの背景色のグラフ

16進カラー値を(最も近い)0-255カラーインデックスに変換するには:

fromhex(){
    hex=${1#"#"}
    r=$(printf '0x%0.2s' "$hex")
    g=$(printf '0x%0.2s' ${hex#??})
    b=$(printf '0x%0.2s' ${hex#????})
    printf '%03d' "$(( (r<75?0:(r-35)/40)*6*6 + 
                       (g<75?0:(g-35)/40)*6   +
                       (b<75?0:(b-35)/40)     + 16 ))"
}

次のように使用します。

$ fromhex 00fc7b
048
$ fromhex #00fc7b
048

HTMLカラー形式で使用されているカラー番号を見つけるには:

#!/bin/dash
tohex(){
    dec=$(($1%256))   ### input must be a number in range 0-255.
    if [ "$dec" -lt "16" ]; then
        bas=$(( dec%16 ))
        mul=128
        [ "$bas" -eq "7" ] && mul=192
        [ "$bas" -eq "8" ] && bas=7
        [ "$bas" -gt "8" ] && mul=255
        a="$((  (bas&1)    *mul ))"
        b="$(( ((bas&2)>>1)*mul ))" 
        c="$(( ((bas&4)>>2)*mul ))"
        printf 'dec= %3s basic= #%02x%02x%02x\n' "$dec" "$a" "$b" "$c"
    elif [ "$dec" -gt 15 ] && [ "$dec" -lt 232 ]; then
        b=$(( (dec-16)%6  )); b=$(( b==0?0: b*40 + 55 ))
        g=$(( (dec-16)/6%6)); g=$(( g==0?0: g*40 + 55 ))
        r=$(( (dec-16)/36 )); r=$(( r==0?0: r*40 + 55 ))
        printf 'dec= %3s color= #%02x%02x%02x\n' "$dec" "$r" "$g" "$b"
    else
        gray=$(( (dec-232)*10+8 ))
        printf 'dec= %3s  gray= #%02x%02x%02x\n' "$dec" "$gray" "$gray" "$gray"
    fi
}

for i in $(seq 0 255); do
    tohex ${i}
done

次のように使用します( "basic"は最初の16色、 "color"はメイングループ、 "gray"は最後のグレー色です):

$ tohex 125                  ### A number in range 0-255
dec= 125 color= #af005f
$ tohex 6
dec=   6 basic= #008080
$ tohex 235
dec= 235  gray= #262626

fromhex関数は素晴らしいです!本当にありがとう!
-mhulse

ラヴィンfromhex。再度、感謝します!また、のチェック#追加しました。フィードバック?
-mhulse

1
はい、先頭の「#」を削除することは合理的な保護です。使用する方がずっと簡単だと思いますhex=${1#"#"}。がない場合$1は何も削除せず#、存在する場合は削除します。更新されたコードをご覧ください。

いいね!はるかにコンパクト。今すぐコードを更新します。ありがとうございました!!!!
-mhulse

少なくとも私のバージョンのxtermでは、\e[0;%s8;2;%s;%s;%sm16Mの色は提供されず、要求されたRGBに最も近い240カラーパレットの色だけが表示されます。
ステファンシャゼラス

14

簡単な答えは、色のWebテーブルで見つけて、それらを色番号に一致させることができるということです。

長い答えは、正しいマッピングは端末に依存するということです—

125呼ばれるエスケープシーケンスのパラメータであるsetaf端末説明します。 tput番号に特別な意味はありません。実際には、特定の端末エミュレーターに依存します。

しばらく前に、ANSIは8色のコードを定義し、それらに番号を付けるための2つのスキームがありました。この2つは、いくつかの端末記述でペアsetf/setbまたはとして見られsetaf/setabます。後者には「ANSIカラー」という意味があるため、より頻繁に使用されることがわかります。前者(setf / setb)は、ncurses FAQに記載されているように赤/青の順序を切り替えました。なぜ赤/青が入れ替わるのですか?、しかし、いずれの場合も、スキームは色に番号を付けるためだけに確立されました。これらの数値とRGBコンテンツの間には、事前に定義された関係はありません。

特定の端末エミュレータには、簡単に列挙できる定義済みのカラーパレットがあり、これらのエスケープシーケンスを使用してプログラムできます。ありません何の関連規格は、あなたが端末エミュレータとの違いを見ることができます、xtermのよくある質問で述べたように、私は青の色合いを好きではありません

ただし、慣習はしばしば標準と混同されます。過去20年間にわたるxtermの開発では、ANSI(8)色を組み込み、aixterm機能(16)色を適合させ、88色と256色の拡張を追加しました。その多くは、さまざまなターミナルエミュレータ用に他の開発者によって採用されています。それはxterm FAQにまとめられています。「xterm」を「xterm-256color」と同等にしないのはなぜですか?

xtermのソースコードには、たとえば、使用するのと同じエスケープシーケンスを使用して、色を示すスクリプトが含まれていtputます。

この質問/回答も役立つ場合があります:Ansi拡張カラーインデックス(17-255)の色のRGB値


トーマスのご協力に感謝します。本当に感謝しています!iTermを実行しているMac / OS Xを使用しています。あなたの説明は、私が私のセットアップについてよりよく理解するのに本当に役立ちます(私は、ウェブ上の他のさまざまな人々のプロンプトカラーから多くのコピー/貼り付けをしました)。時間を割いて詳細で有益な返信をお送りいただきありがとうございます。:)
mhulse

9

tputユーティリティは、印刷するために、256カラールックアップテーブルを使用している8ビットのANSIエスケープシーケンスを(始まるEsc[の使用なるもの)端末能力をので、これらの制御配列は色として解釈することができます。これらは、グラフィックカード全体で一般的に使用される256色の定義済みセットです。

端末で256色すべてを印刷するには、次のワンライナーを試してください。

for c in {0..255}; do tput setaf $c; tput setaf $c | cat -v; echo =$c; done

ヒント:| column列のリストに追加します。

この256色のルックアップテーブルは、Wikipediaページでも次のように見つけることができます。

チャート;  ANSIエスケープコード。 ウィキペディアの8ビット256色ルックアップテーブル。 256色モード—前景:ESC [38; 5; #m背景:ESC [48; 5; #m


3

zshのとIn xterm様の端末(xtermvteのようなベースのターミナルgnome-terminalxfce4-terminal...少なくとも)、あなたが行うことができます。

$ read -s -t1 -d $'\a' $'c?\e]4;125;?\a' && echo "${c##*;}"
rgb:afaf/0000/5f5f

同等のbash:

read -s -t1 -d $'\a' -p $'\e]4;125;?\a' c && echo "${c##*;}"

(端末規則が(with )で無効にされたに送信される色をエスケープシーケンスに照会させます。そうしないと、応答が半分の時間で行規則によって表示されるため、プロンプトの一部として送信されます(zshでksh、bashのように))。echo-sreadvar?prompt-p prompt

カラー125の定義を取得します(ここでは、RGB仕様として、各数値は0〜FFFFの16進数としての赤、緑、青の成分の強度です)。

次のxtermcontrolコマンドを使用して、最初の16色についても同じことができます。

$ xtermcontrol --get-color1
rgb:cdcd/0000/0000

素晴らしい、助けてくれてありがとう!+1
mhulse

@Gilles、ターミナルディシプリンエコーが無効になった後、プロンプトを介してクエリを送信する必要があります。編集を参照してください。
ステファンシャゼラス

@StéphaneChazelas別の端末プログラム(gnome-terminal)(xterm端末)を使用して、コードが正しく動作するようにしました(bashとzshの両方で)奇妙なことに、端末が256色を表示できる場合でもtput colorsレポートし8ます。また、xterm-color(Konsole)は、その端末が1600万色(およびもちろん256色すべて)を完全に表示できる場合でもtput colorsレポートし8ます。そしていや、結果を「色づける」かもしれないtmuxや画面はありません:-)(つまり変更)結果(私はその詳細を知っていました)。つまり、一部のターミナル/コンソールでコードが失敗する可能性があります。

ああ、tohexは私の答えに追加しました、私が予想していたよりも少し長いですが、256色にはかなり奇妙なターンがあります。

0

コンソール用語でのANSIカラー

コンソールが使用する用語プロトコルに応じて、シーケンスは次のようになります:\e[38;5;XXXmまたはANSI番号\e[3XXXmXXX対応する場所。

正しいANSIシーケンスを使用するには、を使用する必要がありますtput

ウィキペディアのANSIエスケープコードに関して、私はこれを書きました。

#!/bin/bash


for ((i=0; i<256; i++)) ;do
    echo -n '  '
    tput setab $i
    tput setaf $(( ( (i>231&&i<244 ) || ( (i<17)&& (i%8<2)) ||
        (i>16&&i<232)&& ((i-16)%6 <(i<100?3:2) ) && ((i-16)%36<15) )?7:16))
    printf " C %03d " $i
    tput op
    (( ((i<16||i>231) && ((i+1)%8==0)) || ((i>16&&i<232)&& ((i-15)%6==0)) )) &&
        printf "\n" ''
done

次のようなものをレンダリングできます:

ここに画像の説明を入力してください

...次に、小さなスクリプトで200以上のフォークを実行するのが嫌いなので、次のように書きました。

#!/bin/bash

# Connector fifos directory
read TMPDIR < <(mktemp -d /dev/shm/bc_shell_XXXXXXX)

fd=3
# find next free fd
nextFd() { while [ -e /dev/fd/$fd ];do ((fd++)) ;done;printf -v $1 %d $fd;}

tputConnector() {
    mkfifo $TMPDIR/tput
    nextFd TPUTIN
    eval "exec $TPUTIN> >(LANG=C exec stdbuf -o0 tput -S - >$TMPDIR/tput 2>&1)"
    nextFd TPUTOUT
    eval "exec $TPUTOUT<$TMPDIR/tput"
}
myTput() { echo -e "$1\ncr" 1>&$TPUTIN && IFS= read -r -d $'\r' -u $TPUTOUT $2
}
tputConnector

myTput op op
myTput "setaf 7" grey
myTput "setaf 16" black
fore=("$black" "$grey")
for ((i=0; i<256; i++)) ;do
    myTput "setab $i" bgr
    printf "  %s%s  %3d  %s" "$bgr" "${fore[ i>231 && i<244||(i<17)&& (i%8<2)||
        (i>16&&i<232)&&((i-16)%6*11+(i-16)/6%6*14+(i-16)/36*10)<58
        ? 1 : 0 ]}" $i "$op"
    (( ((i<16||i>231) && ((i+1)%8==0)) || ((i>16&&i<232)&& ((i-15)%6==0)) )) &&
        printf "\n" ''
done

たった1つのフォークで!同じ結果ですが、はるかに高速です!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.