tput setaf 颜色表?如何确定颜色代码?

mhu*_*lse 109 colors bash tput

我正在为我的终端的PS1.

我正在使用设置颜色变量tput;例如,这里是紫色:

PURPLE=$(tput setaf 125)
Run Code Online (Sandbox Code Playgroud)

题:

我如何找到125其他颜色的颜色代码(例如)?

某处是否有色表指南/备忘单?

我只是不确定什么125是......有什么方法可以将十六进制颜色转换为setaf可以使用的数字?

小智 211

tput 可用的颜色计数由 给出tput colors

要查看基本的 8 种颜色(setf在 urxvt 终端和setafxterm 终端中使用):

$ printf '\e[%sm?' {30..37} 0; echo           ### foreground
$ printf '\e[%sm ' {40..47} 0; echo           ### background
Run Code Online (Sandbox Code Playgroud)

通常命名为:

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
Run Code Online (Sandbox Code Playgroud)

要查看扩展的 256 色(setaf在 urxvt 中使用):

$ printf '\e[48;5;%dm ' {0..255}; printf '\e[0m \n'
Run Code Online (Sandbox Code Playgroud)

如果您想要数字和有序输出:

#!/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}
Run Code Online (Sandbox Code Playgroud)

256 色图表按顺序排列,标有它们的索引


1600 万种颜色需要相当多的代码(某些控制台无法显示)。
基本原理是:

fb=3;r=255;g=1;b=1;printf '\e[0;%s8;2;%s;%s;%sm??? ' "$fb" "$r" "$g" "$b"
Run Code Online (Sandbox Code Playgroud)

fbfront/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
Run Code Online (Sandbox Code Playgroud)

红线,由深变浅(从左到右) 它将呈现一条红线,从左到右的色调变化非常小。如果可以看到这种微小变化,则您的控制台可以显示 1600 万种颜色。

对于 RGB(红、绿、蓝),每个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
Run Code Online (Sandbox Code Playgroud)

样本前景色图表,其索引作为标签

样本背景颜色图表,其索引作为标签

要将十六进制颜色值转换为(最近的)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 ))"
}
Run Code Online (Sandbox Code Playgroud)

将其用作:

$ fromhex 00fc7b
048
$ fromhex #00fc7b
048
Run Code Online (Sandbox Code Playgroud)

要查找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
Run Code Online (Sandbox Code Playgroud)

将其用作(“基本”是前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
Run Code Online (Sandbox Code Playgroud)

  • 嗯,这是一个地狱的答案! (2认同)

ken*_*orb 19

tput实用程序使用 256 色查找表来打印8 位 ANSI 转义序列(以Esc和开头[),它利用了终端功能,因此可以将这些控制序列解释为颜色。这些是预定义的一组 256 种颜色,通常用于图形卡。

要在终端中打印所有 256 色,请尝试以下单行:

for c in {0..255}; do tput setaf $c; tput setaf $c | cat -v; echo =$c; done
Run Code Online (Sandbox Code Playgroud)

提示:附加| column到列式列表。

这个 256 色的查找表也可以在维基百科页面上找到,如下所示:

图表;  ANSI 转义码; 维基百科上的 8 位 256 色查找表; 256 色模式 — 前景:ESC[38;5;#m 背景:ESC[48;5;#m


Tho*_*key 15

简短的回答是,您可以在网络上找到颜色表并将它们与颜色编号匹配。

答案很长,正确的映射取决于终端——

125是一个转义序列的参数被称为setaf在终端描述。 tput对数字没有特别的意义。这实际上取决于特定的终端模拟器。

不久前,ANSI 定义了 8 种颜色的代码,并且有两种编号方案。这两者在某些终端描述中被视为对setf/setbsetaf/setab。由于后者具有“ANSI 颜色”的含义,因此您会看到它的使用频率更高。前者 (setf/setb) 将红色/蓝色的顺序切换为 ncurses 常见问题解答中所述为什么红色/蓝色可以互换?,但在任何一种情况下,该方案都是为仅对颜色进行编号而建立的。这些数字和 RGB 内容之间没有预定义的关系。

对于特定的终端模拟器,有预定义的调色板,可以很容易地列举出来——并且可以使用这些转义序列进行编程。有没有相关的标准,你会看到终端仿真器之间的差异,如xterm的常见问题说明我不喜欢的是蓝荫

然而,惯例经常与标准混淆。在过去 20 年的 xterm 开发过程中,它合并了 ANSI (8) 色,调整了aixterm功能 (16) 色,添加了 88 色和 256 色的扩展。其中大部分已被其他开发人员用于不同的终端仿真器。这在 xterm 常见问题解答中进行了总结为什么不将“xterm”等同于“xterm-256color”?.

xterm 源代码包括用于演示颜色的脚本,例如,使用将使用的相同转义序列tput

您可能会发现此问题/答案也很有帮助:Ansi 扩展颜色索引 (17-255) 中颜色的 RGB 值


F. *_*uri 10

控制台术语上的 ANSI 颜色

序言:关于$TERM变量

使用以下方法验证您的环境: tput colors

如果您使用某些兼容的xterm控制台,则$TERM可能包含以下内容xterm*

echo $TERM
xterm

tput colors
8
Run Code Online (Sandbox Code Playgroud)

进一步的演示将不起作用:您将获得如下所示的图像:

在此处输入图片说明

除非您将其设置为xterm-256color

export TERM=xterm-256color ; reset

tput colors
256
Run Code Online (Sandbox Code Playgroud)

(您甚至可以尝试在设置后运行它export TERM=xterm-mono;)

通过使用简单地完成工作 tput

根据至极长期协议控制台使用,顺序可能是:\e[38;5;XXXm\e[3XXXm其中XXX对应于ANSI号。

为确保您使用正确的 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
Run Code Online (Sandbox Code Playgroud)

可以呈现如下内容:

在此处输入图片说明

优化:通过tput作为后台进程运行来减少分叉

...然后,因为我讨厌在一个小脚本中运行 200 多个分叉,所以我写了这个:

#!/bin/bash

# Connector fifos directory
read TMPDIR < <(mktemp -d /dev/shm/conn_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"
    rm $TMPDIR/tput
    rmdir $TMPDIR
}
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
Run Code Online (Sandbox Code Playgroud)

只有 1 个叉子!相同的结果,但快了大约 10 倍!

如果第一个脚本在我的桌子上运行约 1.12 秒,那么它们在我的 raspberry-pi 上最多需要约 47.4 秒!!

第二个脚本在我的桌面上运行约 0.11 秒,在我的树莓上运行约 4.97 秒。


Sté*_*las 5

使用 zsh 并在一个类似xterm终端(xtermvte基于终端的终端,例如gnome-terminal, xfce4-terminal... 至少),您可以执行以下操作:

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

bash 等价物:

read -s -t1 -d $'\a' -p $'\e]4;125;?\a' c && echo "${c##*;}"
Run Code Online (Sandbox Code Playgroud)

(所需的转义序列来查询颜色要被发送的终端学科echo被禁用(与-s),否则反应将通过线路规程一半的时间被显示,它因此发送作为部分read提示(var?prompt在zsh中就像在 ksh 中,-p prompt在 bash 中))。

获得颜色 125 的定义(这里作为 RGB 规范,每个数字都是红色、绿色和蓝色分量的强度,作为 0 和 FFFF 之间的十六进制数)。

您可以使用以下xtermcontrol命令对前 16 种颜色执行相同操作:

$ xtermcontrol --get-color1
rgb:cdcd/0000/0000
Run Code Online (Sandbox Code Playgroud)