使用测试终端颜色支持tput
#!/bin/sh
colors_supported()
{
command -v tput > /dev/null 2>&1 && tput setaf 1 > /dev/null 2>&1
}
我目前正在使用此代码来确定是否tput
支持终端颜色。
看起来运行良好,问题是:这段代码 POSIX-ly 是否 100% 可移植并可在各种基于 Unix 的系统上使用?我指的是 Linux、*BSD 等。
我之所以这么问,是因为目前我无法在所有地方都进行尝试。
哪些颜色:
tput setaf 1
tput setaf 2
tput setaf 3
tput setaf 4
tput setaf 5
tput setaf 6
tput setaf 7
答案1
长话短说
建议的检查在某些类型的 Unix 系统上将无法工作。
长答案
POSIX 不涵盖这方面
tput
,但请阅读可移植性手册页的部分。大多数系统确实使用 terminfo 名称(例如
setaf
)。例如 FreeBSD(尽管底层库是
ncurses
)提供了tput
仅支持termcap
名称。自由BSD手册页不太清楚,不过可以看看源代码,它使用tgetstr
(termcap
) 而不是tigetstr
(terminfo
)。这
terminfo
手册页列出了terminfo
和termcap
名称,例如,setaf
和AF
。您可以尝试连续使用两者,因为退出代码告知该功能是否已定义。例如,您可以修改测试函数以通过以下方式处理任一情况:
colors_supported() { command -v tput > /dev/null 2>&1 && ( tput setaf || tput AF ) > /dev/null 2>&1 }