`tput` 如何检测颜色支持

`tput` 如何检测颜色支持

我试图让我的 shell 脚本支持尽可能多的终端,即仅在支持时添加 ANSI 颜色、粗体和暗色。但是,我想检测支持的颜色数量。我们可以用tput colors

然而,我发现一些精简到最小的系统没有安装它。所以,我想在shell中实现它。

怎样tput colors运作?任何tput colors与 POSIX 命令等效的命令?请帮忙并解答。

答案1

tput查询基于名称存储在 中的终端的 termcap 或 terminfo 数据库$TERM

tput是一个标准命令clear,但未指定除、initreset(仅在 POSIX 语言环境中)之外的功能名称。

如果某些系统没有tput,它们可能也没有 terminfo 或 termcap 数据库。

另请注意,终端名称不标准化。

例如,有许多终端设置$TERM为,xterm即使它们没有xterm完全或正确地实现 API,并且有许多版本的xtermxterm可以编译或配置为支持不同数量的颜色,但并不总是反映在的值$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

相关内容