我在Makefile中使用tput setaf [colornum] && echo [text] && tput sgr0
来突出显示输出的某些部分,这样可以更快地在输出中查找内容。我的问题是,当我想记录输出时,例如使用make > my_log.txt
,该文件将所有这些控制字符放在先前已着色的行的前面。是否有一种简单的方法可以在终端中同时使用格式化输出以及将其存储为日志的能力?我更喜欢一种解决方案,其中stdout仍然可以记录,而不是在脚本/ makefile内部处理日志文件。
答案 0 :(得分:2)
在打印魔法角色之前,您需要测试stdout是否是终端。如果它不是终端,则不应打印它们。您可以使用[ -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 make,你可以使用类似的东西:
$(if $(MAKE_TERMOUT),tput setaf [colornum];) echo [text] $(if $(MAKE_TERMOUT),; tput sgr0)