我正在为终端的PS1着色。

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

PURPLE=$(tput setaf 125)


问题:

我如何找到其他颜色的颜色代码(例如125)? />
在某处有颜色表指南/备忘单吗?

我只是不确定125是什么...有某种方法可以获取十六进制颜色并将其转换为数字setaf可以使用吗?

评论

更新了指向SVG颜色表的链接

#1 楼

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

要查看基本的8种颜色(如urxvt终端中的setf和xterm终端中的setaf所使用):

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


,通常命名为this:

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"


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



会出现红线从左到右的音调变化很小。如果可以看到很小的变化,则您的控制台可以支持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=""
    [[ $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






要将十六进制颜色值转换为(最近的)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=$((%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


评论


您的fromhex功能很棒!非常感谢!

– mhulse
16-3-12的3:05

Lovin’from hex。再次感谢!另外,我为#添加了支票。反馈?

– mhulse
16-3-12的5:23

是的,删除开头的“#”是合理的保护。我发现使用hex = $ {1#“#”}更加简单。如果$ 1没有#,它将删除任何内容,如果存在则将其删除。查看我更新的代码。

–user79743
16-3-12在7:03

真好!更紧凑。现在更新我的代码。谢谢!!!!

– mhulse
16年3月12日在7:30

好吧,这是一个答案的地狱!

–PiersyP
17年1月7日在17:50

#2 楼

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附加到列列表中。

也可以在Wikipedia页面上找到此256色查找表,如下所示:



#3 楼

简短的答案是,您可以在Web表格上找到颜色并将其与颜色编号匹配。

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

125是转义序列的参数,在终端说明中称为setaftput对号码没有特殊含义。实际上,这取决于特定的终端仿真器。

前一阵子,ANSI定义了8种颜色的代码,并且有两种对这些颜色进行编号的方案。在某些终端说明中,这两个对称为setf/setbsetaf/setab。由于后者具有“ ANSI颜色”的含义,因此您会看到使用频率更高。如ncurses常见问题解答中所述,前者(setf / setb)切换了红色/蓝色的顺序。为什么要互换红色/蓝色?,但无论哪种情况,都建立了仅对颜色编号的方案。这些数字与RGB含量之间没有预定义的关系。

对于特定的终端仿真器,有预定义的调色板,可以很容易地枚举它们,并且可以使用这些转义序列进行编程。没有相关的标准,并且您会看到终端仿真器之间的差异,正如xterm常见问题中所述,我不喜欢那种蓝色。

但是,惯例经常与标准混淆。在过去20年开发xterm的过程中,它合并了ANSI(8)颜色,改编了aixterm功能(16)颜色,并增加了88和256色的扩展名。其他开发人员已经为不同的终端仿真器采用了许多方法。 xterm常见问题中对此进行了总结。为什么不将“ xterm”等同于“ xterm-256color” ?。

xterm源代码包括用于演示颜色的脚本,例如,使用与tput会使用。

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

评论


非常感谢您的帮助Thomas,非常感谢!我在运行iTerm的Mac / OS X上。您的解释确实可以帮助我进一步了解自己的设置(我已经从网上其他各种提示色中进行了大量复制/粘贴)。非常感谢您抽出宝贵时间给我写详细而有用的回复。 :)

– mhulse
16-3-12的3:04

#4 楼

控制台术语上的ANSI颜色

序言:关于$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。关于维基百科的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


可以呈现如下内容:



优化bash:通过ru减少fork将tput用作后台进程

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

#!/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  %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 "\ncr" 1>&$TPUTIN && IFS= read -r -d $'\r' -u $TPUTOUT 
}
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秒的速度运行,则它们在我的raspberry-pi上最多需要约47.4秒!

第二个脚本在我的办公桌上运行〜0.11秒,在树莓上运行〜4.97秒。

评论


xterm-256color当然不是普遍适用的,而且通常是错误的选择。 unix.stackexchange.com/a/560992/5132

– JdeBP
20年1月9日在20:58

当然,腻子只是另一种实现方式...我不使用腻子。在我的桌子上,我可以使用gnome-terminal,mate-terminal,konsole和xterm(我最喜欢的),它们都可以识别xterm-256color。

– F. Hauri
20年1月9日在21:17



不。它们不参与任何形式的“识别”,并且对它们使用xterm-256color也是错误的选择。 GNOME终端的正确终端类型例如是gnome-256color或vte-256colour。 unix.stackexchange.com/a/515517/5132

– JdeBP
20 Jan 9 '20 at 21:35

#5 楼

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

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


等效:

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


(您希望转义序列查询在禁用终端规则echo后(使用-s)要发送的颜色,否则响应将显示为线时间的一半,因此作为read提示的一部分发送(在zsh中像qsh一样在qsh中使用var?prompt,在bash中使用-p prompt))。

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

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

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


评论


太好了,非常感谢您的帮助! +1

– mhulse
16-3-12的3:04

@Gilles,您希望在禁用终端规则回显后通过提示符发送查询。参见编辑。

–StéphaneChazelas
16年3月12日在7:06

@StéphaneChazelas使用另一个终端程序(gnome-terminal)(它是一个xterm终端),我让您的代码可以正常工作(在bash和zsh中)奇怪的是:即使终端能够显示256种颜色,tput颜色也只能报告8种颜色。同样,即使该终端完全能够显示1600万种颜色(当然,所有256种颜色),xterm-color(Konsole)输出颜色也只能报告8。不,没有tmux或屏幕可能会“着色”:-)(即更改)结果(我知道该细节)。简而言之:您的代码可能在某些终端/控制台中失败。

–user79743
16年3月12日在21:55

啊,tohex添加到我的答案中,比我期望的要长一点,但是256色有很多怪异的转折。

–user79743
16年3月12日在22:02