如何检查 Bash 是否可以打印颜色

如何检查 Bash 是否可以打印颜色

我想知道是否有任何方法可以检查我的程序是否可以使用颜色输出终端输出。

运行命令如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作为其终端描述,但仍然支持颜色。)

相关内容