我如何检查我的 Linux 盒子中是否存在颜色?

我如何检查我的 Linux 盒子中是否存在颜色?

我想在我的linux机器上做这样的事情:

if [[ colors exist ]];then
echo "some text in colors"
fi

我的疑问是:

我正在使用 sed 在日志文件中为某些文本添加颜色,但是如果 linux 盒子没有启用颜色,它会以不必要的方式修改日志文件,比如添加一些不必要的字符,例如 [033m 等

答案1

也许使用 tput 检查可用颜色数,

ncolors=$(tput colors)

if [[ $ncolors -ge 8 ]];then
   # colors available
fi

答案2

tty 颜色是终端其上显示文本。如今几乎所有终端都处理 ANSI 转义序列,因此您可以在生成时对文本进行着色,但实际上应该在写入时进行着色(也许在写入端的用户控制下)。例如,为寻呼机的文本设置自定义颜色)。

答案3

检测是否直接从终端模拟器运行,或者输出是否被写入日志文件的一种可能方法是使用readlink

if [[ $(readlink -f /dev/stdout) =~ '^/dev/pts/' ]]; then
   # colors available
fi

这通常应该在带有 udev 和 procfs 的现代 Linux 上工作。我不确定是否存在更便携的东西。这使用了特殊的 bash 正则表达式运算符=~,因此它仅适用于 bash。

正如其他人已经解释的那样,另一种方法是使用tty >/dev/null;但就您而言,您可能只对标准输出感兴趣,而不对标准输入感兴趣,因此您需要使标准输出成为以下标准输入tty

if tty <&1 >/dev/null; then
   # colors available
fi

这会在您跑步时禁用颜色./myscript.sh >>log_file,但在您跑步时启用它们./myscript.sh

我也建议使用[[ $(tput colors) -ge 8 ]],这样当环境变量TERM设置为时dumb,就不会输出颜色。

如果您确实写入了带有颜色的日志文件,您仍然可以读取它;不过,您必须使用类似less -rmultitail -cT ansi来自支持颜色的终端模拟器的东西。

相关内容