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

Ang*_*gas 71 shell colors terminal

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

运行命令less并查看使用颜色输出的程序的输出,输出显示错误,例如

[ESC[0;32m0.052ESC[0m ESC[1;32m2,816.00 kbESC[0m]

谢谢

Mik*_*kel 84

我的想法是让我的应用程序知道如果程序无法打印,则不要对输出着色,例如,将通过 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.
Run Code Online (Sandbox Code Playgroud)

在 C 中,您必须进行更多的输入,但使用isatty和 中列出的函数可以获得相同的结果man 3 terminfo


D4R*_*RIO 25

这应该足够了:

$ tput colors
Run Code Online (Sandbox Code Playgroud)

tput 颜色解释:

如果您查看联机帮助页,您会注意到这一点:

SYNOPSIS
       tput [-Ttype] capname [parms ... ]
Run Code Online (Sandbox Code Playgroud)

和...

   capname
          indicates the capability from the terminfo database.  When term?
          cap  support is compiled in, the termcap name for the capability
          is also accepted.
Run Code Online (Sandbox Code Playgroud)

termcapcolors位于 terminfo 数据库中,因此您可以要求它。如果您的退出状态为零,则 termcap 将被编译。但如果您有类似以下内容:

$ tput unknowntermcap
tput: unknown terminfo capability 'unknowntermcap'
$ echo $?
4
Run Code Online (Sandbox Code Playgroud)

这表明不存在 unknowntermcap。所以这:

$ tput colors
8
$ echo $?
0
Run Code Online (Sandbox Code Playgroud)

表明你的命令是正确的。

其他有用的方法:

  • 在 C 中,您可以使用isatty并查看它是否是 TTY
  • 看看它是否是一个看起来像 $TERM 变量的哑终端

干杯

  • 请注意,`tput colors` 返回本地终端数据库对终端的看法。这可能与终端实际可以执行的操作相对应,也可能不对应,特别是对于像“xterm”这样有多种变体(从黑白到 256 种颜色)的终端类型。 (2认同)

Gil*_*il' 7

我的想法是让我的应用程序知道如果程序无法打印,则不要对输出着色,例如,将通过 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
Run Code Online (Sandbox Code Playgroud)

从使用 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);
Run Code Online (Sandbox Code Playgroud)


Ste*_*ski 5

运行像less这样的命令并查看使用颜色输出的程序的输出,输出显示错误,例如

[ESC[0;32m0.052ESC[0m ESC[1;32m2,816.00 kbESC[0m]]

尝试使用less --RAW-CONTROL-CHARS.

在这个例子中,我使用logtool,它使用颜色打印输出。

没有 --RAW-CONTROL-CHARS :

$ head -20 /var/log/messages | logtool | less
ESC[0mESC[0;37mMar 20 11:43:52ESC[0mESC[1;36m host1ESC[0mESC[0;37m rsyslogd:ESC[0m ^GESC[0;31mlast message repeated 14 timesESC[0mESC[0m
Run Code Online (Sandbox Code Playgroud)

使用 --RAW-CONTROL-CHAR (想象一下这是漂亮的颜色。另外,我不确定为什么^G要显示它。):

$ head -20 /var/log/messages | logtool | less --RAW-CONTROL-CHARS
Mar 20 11:43:52 host1 rsyslogd: ^Glast message repeated 14 times
Run Code Online (Sandbox Code Playgroud)