我想在我的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 -r
或multitail -cT ansi
来自支持颜色的终端模拟器的东西。