2015-01-21 108 views
0

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

回答

2

在打印您的魔法字符之前,您需要测试stdout是否为终端。如果它不是一个终端,你不应该打印它们。你可以用[ -t 1 ]来测试(1是stdout的文件描述符)。所以:

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

编辑

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

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

完美,谢谢!所以我猜'-t'会检查你当前输出的文件描述符?这是非常有用的知道。 – 2015-01-21 05:52:41

+1

编号'-t'检查你给它的描述符。上面我给它描述符1,正如我在我的回答中提到的那样,它是stdout的描述符。如果你想要的话,你可以使用'2'作为stderr,或者使用'0'作为标准输入,或者如果你碰巧知道它们是有效的,也可以使用其他数字。 – MadScientist 2015-01-21 13:29:37

+0

我明白了,所以当stdout被重定向到一个文件时,带有describetor的'stdout文件'在bash中不会被视为'open'。感谢编辑。 – 2015-01-22 00:55:38