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)
如果您查看联机帮助页,您会注意到这一点:
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)
表明你的命令是正确的。
干杯
我的想法是让我的应用程序知道如果程序无法打印,则不要对输出着色,例如,将通过 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)
运行像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)