彩色终端输出和日志记录
Coloured terminal output & logging
我在 Makefile 中使用 tput setaf [colornum] && echo [text] && tput sgr0
来突出显示输出的某些部分,这样可以更快地在输出中找到内容。我的问题是,当我想记录输出时,例如使用 make > my_log.txt
,文件在先前着色的行前面有所有这些控制字符。有没有一种简单的方法既可以在终端中格式化输出又可以将其存储为日志?我更喜欢 stdout 保持可记录的解决方案,而不是在脚本/makefile 内部处理日志文件。
在打印魔法字符之前,您需要测试 stdout 是否为终端。如果它不是终端,则不应打印它们。您可以使用 [ -t 1 ]
进行测试(1 是标准输出的文件描述符)。所以:
[ -t 1 ] && tput setaf [colornum]; echo [text]; [ -t 1 ] && tput sgr0; true
编辑
我要补充一件事:从 GNU make 4.1 开始,您还可以测试 make 变量 MAKE_TERMOUT
,如果设置了它,那么您应该假设您正在写入终端,即使 [=14= 】 说没有。这是因为这些版本的 make 支持一项新功能 --output-sync
,它确保即使在并行构建期间并行作业的输出也不会混合。但是,为了做到这一点,make 必须临时捕获输出然后以串行方式显示它,这意味着对于 shell 进程来说它永远不会像 stdout 是一个终端。如果你使用那个版本的 GNU make 你可以使用类似的东西:
$(if $(MAKE_TERMOUT),tput setaf [colornum];) echo [text] $(if $(MAKE_TERMOUT),; tput sgr0)
我在 Makefile 中使用 tput setaf [colornum] && echo [text] && tput sgr0
来突出显示输出的某些部分,这样可以更快地在输出中找到内容。我的问题是,当我想记录输出时,例如使用 make > my_log.txt
,文件在先前着色的行前面有所有这些控制字符。有没有一种简单的方法既可以在终端中格式化输出又可以将其存储为日志?我更喜欢 stdout 保持可记录的解决方案,而不是在脚本/makefile 内部处理日志文件。
在打印魔法字符之前,您需要测试 stdout 是否为终端。如果它不是终端,则不应打印它们。您可以使用 [ -t 1 ]
进行测试(1 是标准输出的文件描述符)。所以:
[ -t 1 ] && tput setaf [colornum]; echo [text]; [ -t 1 ] && tput sgr0; true
编辑
我要补充一件事:从 GNU make 4.1 开始,您还可以测试 make 变量 MAKE_TERMOUT
,如果设置了它,那么您应该假设您正在写入终端,即使 [=14= 】 说没有。这是因为这些版本的 make 支持一项新功能 --output-sync
,它确保即使在并行构建期间并行作业的输出也不会混合。但是,为了做到这一点,make 必须临时捕获输出然后以串行方式显示它,这意味着对于 shell 进程来说它永远不会像 stdout 是一个终端。如果你使用那个版本的 GNU make 你可以使用类似的东西:
$(if $(MAKE_TERMOUT),tput setaf [colornum];) echo [text] $(if $(MAKE_TERMOUT),; tput sgr0)