我试图让我的 shell 脚本支持尽可能多的终端,即仅在支持时添加 ANSI 颜色、粗体和暗色。但是,我想检测支持的颜色数量。我们可以用tput colors
。
然而,我发现一些精简到最小的系统没有安装它。所以,我想在shell中实现它。
怎样tput colors
运作?任何tput colors
与 POSIX 命令等效的命令?请帮忙并解答。
答案1
tput
查询基于名称存储在 中的终端的 termcap 或 terminfo 数据库$TERM
。
tput
是一个标准命令clear
,但未指定除、init
和reset
(仅在 POSIX 语言环境中)之外的功能名称。
如果某些系统没有tput
,它们可能也没有 terminfo 或 termcap 数据库。
另请注意,终端名称不标准化。
例如,有许多终端设置$TERM
为,xterm
即使它们没有xterm
完全或正确地实现 API,并且有许多版本的xterm
和xterm
可以编译或配置为支持不同数量的颜色,但并不总是反映在的值$TERM
,更不用说即使对于那些使用相同转义序列的颜色,不同颜色的色调也会因一个终端而异,因此这不是一门精确的科学。
在没有 terminfo/termcap 数据库的系统上,您必须提供自己的数据库(可能是具有最常用终端的子集,并且只有感兴趣的功能)并实现一种从脚本查询它的方法。
至少,这可能只是一个大案例构造:
case $TERM in
( fbterm )
colors=256
fg_color() { printf '\33[1;%sd}' "$1"; }
;;
( *256color* | alacritty | i[tT]erm* )
colors=256
fg_color() {
if [ "$1" -lt 8 ]; then
printf '\33[3%sm' "$1"
elif [ "$1" -lt 16 ]; then
printf '\33[9%sm' "$(( $1 - 8 ))"
else
printf '\33[38;5;%sm' "$1"
fi
}
# and so on.
esac