支持多少种颜色以及如何更改前景色和背景色取决于终端。
数据库terminfo通常可以帮助您找到正确的顺序。
大多数彩色终端支持 ANSI 颜色转义序列来将前景色和背景色从 0 更改为 7。
那是:
printf "\33[3${n}m"printf "\33[4${n}m"一些(罕见的)终端(例如emu)对这些 ANSI 颜色使用不同的序列。
一些(罕见的)终端(例如 QNX 控制台)具有不同的转义序列和不同的颜色。
有些(罕见)使用颜色对。您定义背景和前景的颜色对,然后使用转义序列来选择要使用的颜色对。
现在,xterm 和大多数现代自由软件终端仿真器将基本的 8 种 ANSI 颜色扩展到最多 16 种(其中 8 到 15 是 ANSI 颜色 0 到 7 的更亮版本)、88 或 256 种颜色。
有些终端仅支持 8 种颜色,但如果粗体也打开(用于前景)或闪烁(用于背景),则rxvt使用更亮的颜色。会产生比 更亮的蓝色。\033[34;1m\033[34m
使用颜色的最便携方法是使用 terminfo 数据库。
可以通过tput命令来实现。tcsh并且zsh还有一个echoti内置的。
假设 terminfo 数据库正确并且 的值$TERM正确反映了您正在使用的终端:
tput colors
Run Code Online (Sandbox Code Playgroud)
将为您提供终端支持的颜色数量。
如今,除了上面提到的罕见例外之外,您可以假设您的终端将支持 ANSI 颜色。ANSI 背景和前景色的 terminfo 功能为setab和setaf。如果终端支持超过 8 种颜色,您仍然可以使用该功能来查询它们。
tput setaf 233
Run Code Online (Sandbox Code Playgroud)
如果终端支持 256 色,则应输出该颜色 233 的正确转义序列。
对于xterm,setaf输出\033[30m..\033[37m颜色 0 到 7、\033[90m..\033[97m颜色 8 到 15 以及\033[38;5;16m..\033[38;5;255m颜色 16 到 255。
\033[38;5;0m..\033[38;5;15m也可以工作,但比颜色 0 到 15 的更便携的等效项长 4 个字节。
因此,要测试终端支持的所有颜色。如果支持 ansi 颜色:
i=0; n=$(tput colors); while [ "$i" -lt "$n" ]; do
tput setaf "$i"; printf %04d "$i"
i=$((i + 1))
done
Run Code Online (Sandbox Code Playgroud)
如果支持其他颜色:
i=0; n=$(tput colors); while [ "$i" -lt "$n" ]; do
tput setf "$i"; printf %04d "$i"
i=$((i + 1))
done
Run Code Online (Sandbox Code Playgroud)
如果它适用于颜色对(如 hpterm-color):
i=0; n=$(tput pairs); while [ "$i" -lt "$n" ]; do
tput scp "$i"; printf %04d "$i"
i=$((i + 1))
done
Run Code Online (Sandbox Code Playgroud)
现在,要重新定义颜色或颜色对,这在终端之间也有所不同。
有一个initcterminfo 功能可以为那些可以执行此操作的终端重新定义给定的颜色。并initp重新定义一对。
例如将颜色 1 重新定义为亮白色:
tput initc 1 1000 1000 1000
Run Code Online (Sandbox Code Playgroud)
使用xterm,发送序列:\033]4;1;rgb:FF/FF/FF\033\。
在使用颜色对的终端上将颜色对 1 重新定义为黑底白字:
tput initp 1 1000 1000 1000 0 0 0
Run Code Online (Sandbox Code Playgroud)