端末のPS1
をカラー化しています。
tput
を使用して色変数を設定しています。たとえば、ここでは紫です。
PURPLE=$(tput setaf 125)
他の色の色コード(125
など)を見つけるにはどうすればよいですか?
カラーテーブルガイド/チートシートはどこにありますか?
125
が何であるかわからない…16進数の色を取得して、setaf
が使用できる数値に変換する方法はありますか?
Tputで使用できる色の数はtput colors
。
基本的な8色を表示するには(urxvtターミナルのsetf
とxtermターミナルのsetaf
で使用される):
$ 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色を表示するには(urxvtのsetaf
で使用):
$ 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
次のように使用します(「基本」は最初の16色、「色」はメイングループ、「灰色」は最後の灰色):
$ tohex 125 ### A number in range 0-255
dec= 125 color= #af005f
$ tohex 6
dec= 6 basic= #008080
$ tohex 235
dec= 235 gray= #262626
簡単に言えば、Webで色の表を見つけて、色番号と一致させることができます。
長い答えは、正しいマッピングは端末に依存するということです—
125
は、端末の説明でsetaf
と呼ばれるエスケープシーケンスのパラメーターです。 tput
は、番号に特定の意味を付けません。それは実際には特定の端末エミュレータに依存します。
しばらく前に、ANSIは8色のコードを定義し、それらに番号を付ける方法は2つありました。この2つは、一部の端末の説明ではsetf/setb
またはsetaf/setab
のペアとして表示されます。後者は「ANSI色」の意味合いを持っているので、より頻繁に使用されることがわかります。前者(setf/setb)は、ncursesに記載されているように赤/青の順序を切り替えましたFAQ赤/青が交換される理由しかし、どちらの場合も、スキームは色に番号を付けるだけのために確立されたものであり、これらの番号とRGBコンテンツの間には事前定義の関係はありません。
特定の端末エミュレータについては、十分に簡単に列挙できる定義済みのカラーパレットがあり、これらのエスケープシーケンスを使用してプログラムできます。 noに関連する標準があり、xterm FAQその青の色合いが好きではありません。
ただし、慣例は標準と混同されることがよくあります。過去20年間のxtermの開発では、ANSI(8)色を組み込み、aixterm
機能(16)色を採用し、88色と256色の拡張機能を追加しました。その多くは、さまざまなターミナルエミュレータ用に他の開発者によって採用されています。これはxtermに要約されていますFAQ"xterm"を "xterm-256color"と同等にしないのはなぜですか?。
Xtermのソースコードには、たとえばtput
が使用するのと同じエスケープシーケンスを使用するなど、色を示すためのスクリプトが含まれています。
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を使用し、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##*;}"
(エスケープシーケンスが送信される色をクエリするようにしたいafter端末の規律echo
は無効になっています(-s
)それ以外の場合、応答は半分の時間の回線分野によって表示されるため、read
プロンプトの一部として送信されます(var?prompt
kshと同様にzshでも-p Prompt
in bash))。
色125の定義を取得するには(ここではRGB仕様として、各数値は0、FFFFの16進数としての赤、緑、青のコンポーネントの強度です)。
xtermcontrol
コマンドを使用して、最初の16色についても同じことができます。
$ xtermcontrol --get-color1
rgb:cdcd/0000/0000
$TERM
変数について次の方法で環境を確認してください:tput colors
互換のxterm
コンソールを使用している場合、$TERM
にはxterm*
のようなものが含まれている可能性があります。
echo $TERM
xterm
tput colors
8
それ以上のデモは機能しません。次のような画像が表示されます。
これをxterm-256color
に設定しない限り:
export TERM=xterm-256color ; reset
tput colors
256
(export TERM=xterm-mono
を設定した後、これを実行することもできます;)
tput
を使用して単純にジョブを実行するコンソールが使用するプロトコルに応じて、シーケンスは次のようになります。\e[38;5;XXXm
または\e[3XXXm
ここで、XXX
はansi番号に対応します。
正しいANSIシーケンスを使用するには、tput
を使用する必要があります。
Wikipediaの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つだけ!同じ結果ですが、約10倍高速です。
最初のスクリプトが私のデスクで〜1.12秒で実行されると、私のラズベリーpiで最大〜47.4秒かかります!!
2番目のスクリプトは、私のデスクでは〜0.11秒、ラズベリーでは〜4.97秒で実行されます。