回答:
tputで使用できる色の数は、によって与えられtput colors
ます。
基本的な8色(setf
urxvtターミナルおよびsetaf
xtermターミナルで使用される)を表示するには:
$ 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色(setaf
urxvtで使用される)を表示するには:
$ 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}
1600万色にはかなりのコードが必要です(一部のコンソールではこれを表示できません)。
基本は次のとおりです。
fb=3;r=255;g=1;b=1;printf '\e[0;%s8;2;%s;%s;%sm▒▒▒ ' "$fb" "$r" "$g" "$b"
fb
ですfront/back
か3/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万色に対応しています。
それぞれr
、g
、と b
RGB(赤、緑、青)について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
hex=${1#"#"}
。がない場合$1
は何も削除せず#
、存在する場合は削除します。更新されたコードをご覧ください。
\e[0;%s8;2;%s;%s;%sm
16Mの色は提供されず、要求されたRGBに最も近い240カラーパレットの色だけが表示されます。
簡単な答えは、色の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値
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ページでも次のように見つけることができます。
zshのとIn xterm
様の端末(xterm
やvte
のようなベースのターミナルgnome-terminal
、xfce4-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
-s
read
var?prompt
-p prompt
カラー125の定義を取得します(ここでは、RGB仕様として、各数値は0〜FFFFの16進数としての赤、緑、青の成分の強度です)。
次のxtermcontrol
コマンドを使用して、最初の16色についても同じことができます。
$ xtermcontrol --get-color1
rgb:cdcd/0000/0000
tput colors
レポートし8
ます。また、xterm-color(Konsole)は、その端末が1600万色(およびもちろん256色すべて)を完全に表示できる場合でもtput colors
レポートし8
ます。そしていや、結果を「色づける」かもしれないtmuxや画面はありません:-)(つまり変更)結果(私はその詳細を知っていました)。つまり、一部のターミナル/コンソールでコードが失敗する可能性があります。
コンソールが使用する用語プロトコルに応じて、シーケンスは次のようになります:\e[38;5;XXXm
またはANSI番号\e[3XXXm
にXXX
対応する場所。
正しい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つのフォークで!同じ結果ですが、はるかに高速です!