彩色终端输出和记录



我在 Makefile 中使用tput setaf [colornum] && echo [text] && tput sgr0来突出显示输出的某些部分,这很好,可以更快地在输出中找到内容。我的问题是,当我想记录输出时,例如使用 make > my_log.txt ,该文件在以前着色的行前面具有所有这些控制字符。有没有一种简单的方法可以同时拥有两者 - 终端中的格式化输出以及将其存储为日志的能力?我更喜欢标准输出保持可记录的解决方案,而不是在脚本/生成文件中内部处理日志文件。

在打印魔法字符之前,您需要测试标准输出是否为终端。 如果它不是终端,则不应打印它们。 您可以使用 [ -t 1 ] 对此进行测试(1 是 stdout 的文件描述符)。 所以:

[ -t 1 ] && tput setaf [colornum]; echo [text]; [ -t 1 ] && tput sgr0; true

编辑

我应该补充一件事:从 GNU make 4.1 开始,你也可以测试 make 变量MAKE_TERMOUT,如果它被设置了,那么你应该假设你正在写入终端,即使-t说不。 这是因为这些版本的 make 支持一项新功能 --output-sync ,该功能可确保即使在并行构建期间,并行作业的输出也不会混合在一起。 但是,为了做到这一点,make 必须暂时捕获输出,然后以串行方式显示它,这意味着对于 shell 进程,它看起来永远不会像 stdout 是一个终端。 如果你使用的是那个版本的GNU,你可以使用类似的东西:

$(if $(MAKE_TERMOUT),tput setaf [colornum];) echo [text] $(if $(MAKE_TERMOUT),; tput sgr0)

最新更新