![如何检查 Bash 是否可以打印颜色](https://linux22.com/image/48325/%E5%A6%82%E4%BD%95%E6%A3%80%E6%9F%A5%20Bash%20%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E6%89%93%E5%8D%B0%E9%A2%9C%E8%89%B2.png)
我想知道是否有任何方法可以检查我的程序是否可以使用颜色输出终端输出。
运行命令如less
并查看使用颜色输出的程序的输出,输出显示不正确,如下所示:
[ESC[0;32m0.052ESC[0m ESC[1;32m2,816.00 kbESC[0m]
答案1
这个想法是让我的应用程序知道,如果程序无法打印,则不要对输出进行着色,例如,通过 cron 作业将输出记录到文件中,无需记录彩色输出,但在手动运行时,我喜欢查看输出有颜色
您用什么语言编写申请?
正常的方法是检查输出设备是否是 tty,如果是,则检查该类型的终端是否支持颜色。
在 中bash
,看起来像
# check if stdout is a terminal...
if test -t 1; then
# see if it supports colors...
ncolors=$(tput colors)
if test -n "$ncolors" && test $ncolors -ge 8; then
bold="$(tput bold)"
underline="$(tput smul)"
standout="$(tput smso)"
normal="$(tput sgr0)"
black="$(tput setaf 0)"
red="$(tput setaf 1)"
green="$(tput setaf 2)"
yellow="$(tput setaf 3)"
blue="$(tput setaf 4)"
magenta="$(tput setaf 5)"
cyan="$(tput setaf 6)"
white="$(tput setaf 7)"
fi
fi
echo "${red}error${normal}"
echo "${green}success${normal}"
echo "${green}0.052${normal} ${bold}${green}2,816.00 kb${normal}"
# etc.
在 C 中,您必须进行更多的输入,但可以使用以下命令获得相同的结果伊萨蒂以及 中列出的功能man 3 terminfo
。
答案2
这应该足够了:
$ tput colors
tput颜色解释:
如果您查看联机帮助页,您会注意到这一点:
SYNOPSIS
tput [-Ttype] capname [parms ... ]
和...
capname
indicates the capability from the terminfo database. When term‐
cap support is compiled in, the termcap name for the capability
is also accepted.
termcapcolors
位于 terminfo 数据库中,因此您可以请求它。如果您的退出状态为零,则 termcap 已编译。但是如果您有类似以下内容:
$ tput unknowntermcap
tput: unknown terminfo capability 'unknowntermcap'
$ echo $?
4
这表明unknowntermcap不存在。所以这:
$ tput colors
8
$ echo $?
0
说明你的命令是正确的。
其他有用的方法:
- 在C中,你可以只使用伊萨蒂看看是否是 TTY
- 看看它是否是一个愚蠢的终端,看起来 $TERM 变量
干杯
答案3
这个想法是让我的应用程序知道,如果程序无法打印,则不要对输出进行着色,例如,通过 cron 作业将输出记录到文件中,无需记录彩色输出,但在手动运行时,我喜欢查看输出有颜色。
对于此用例,程序通常执行的操作(例如 GNU ls 或 GNU grep with --color=auto
)是在输出要发送到终端时使用颜色,否则不使用颜色。不支持 ANSI 颜色更改序列的终端很少见,因此让用户覆盖默认选择是可以接受的。无论如何,请确保您的应用程序具有强制打开或关闭颜色的选项。
在 shell 脚本中,用于[ -t 1 ]
测试标准输出是否为终端。
# option processing has set $color to yes, no or auto
if [ $color = auto ]; then
if [ -t 1 ]; then color=yes; else color=no; fi
fi
从使用 C API 的程序中,调用isatty(1)
.
# option processing has set use_color to 0 for no, 1 for yes or 2 for auto
if (use_color == 2) use_color = isatty(1);
答案4
less
那是因为没有设置解释 ANSI 转义符的错误;寻找R
在$LESSOPTS
.至于确定系统是否知道您的终端可以处理颜色,tput colors
将输出它支持的颜色数量或-1
是否不支持颜色。 (请注意,某些终端可能使用xterm
而不是xterm-color
作为其终端描述,但仍然支持颜色。)