有时,make 的输出会填满屏幕。识别所有警告和错误消息行有点困难。我知道外壳颜色输出可能有帮助有人可以帮助我吗?
看看
colormake
,找到这里
$ apt-cache search colormake
colormake - simple wrapper around make to colorize output
利用google的力量,我也找到了这个bash函数。
make()
{
pathpat="(/[^/]*)+:[0-9]+"
ccred=$(echo -e "\033[0;31m")
ccyellow=$(echo -e "\033[0;33m")
ccend=$(echo -e "\033[0m")
/usr/bin/make "$@" 2>&1 | sed -E -e "/[Ee]rror[: ]/ s%$pathpat%$ccred&$ccend%g" -e "/[Ww]arning[: ]/ s%$pathpat%$ccyellow&$ccend%g"
return ${PIPESTATUS[0]}
}
我来到这个问题寻找一种对
make
输出进行着色的解决方案,然后想起不久前我研究了一个很好的通用日志着色器并发现了ccze
。它适用于我扔给它的任何东西,从 Minecraft 服务器日志到 Exim MTA。
make | ccze -A
注意:指定 -A 选项将启用“raw-ansi”,否则根据我的经验,某些输出会在运行结束时“清除”。
如果您是 emacs 用户,可以使用命令
M-x compile
。 这会将 make 输出放入突出显示的缓冲区中,其中错误充当源代码中相关行的链接。
以下怎么样?
它是由这个Makefile的简化版本生成的。
PROJECT = programname
SHELL = /bin/bash
OBJS = $(patsubst src/%.cc,obj/%.o,$(wildcard src/*.cc))
RESET = \033[0m
make_std_color = \033[3$1m # defined for 1 through 7
make_color = \033[38;5;$1m # defined for 1 through 255
WRN_COLOR = $(strip $(call make_std_color,3))
ERR_COLOR = $(strip $(call make_std_color,1))
STD_COLOR = $(strip $(call make_color,8))
COLOR_OUTPUT = 2>&1 | \
while IFS='' read -r line; do \
if [[ $$line == *:[\ ]error:* ]]; then \
echo -e "$(ERR_COLOR)$${line}$(RESET)"; \
elif [[ $$line == *:[\ ]warning:* ]]; then \
echo -e "$(WRN_COLOR)$${line}$(RESET)"; \
else \
echo -e "$(STD_COLOR)$${line}$(RESET)"; \
fi; \
done; exit $${PIPESTATUS[0]};
.PHONY: $(PROJECT)
$(PROJECT): bin/$(PROJECT)
bin/$(PROJECT): $(OBJS)
@mkdir -p bin
@echo g++ -o $@ $(OBJS) -Iinclude
@g++ -o $@ $(OBJS) -Iinclude $(COLOR_OUTPUT)
obj/%.o: src/%.cc
@mkdir -p obj
@echo g++ -o $@ -c $< -Wall -Wextra
@g++ -o $@ -c $< -Wall -Wextra $(COLOR_OUTPUT)
假设所有 C++ 源文件都位于
src
目录(扩展名 .cc)中,头文件位于 include
目录中。
又一个 bash 函数,非常简洁
make()
{
/usr/bin/make "$@" 2>&1 | sed -E -e "s/error/ $(echo -e "\\033[31m" ERROR "\\033[0m"/g)" -e "s/warning/ $(echo -e "\\033[0;33m" WARNING "\\033[0m"/g)"
return ${PIPESTATUS[0]}
}
我曾经对日志文件使用multitail,它可以根据各种标准突出显示(和过滤)行。
GCC 有一个环境变量:
export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'
我最近为我们的团队研究了这个问题,并修改了 make 的源代码以生成输出,其中 CL.EXE (Windows) 输出使用 ANSI 转义码以颜色获取文本“警告”和“错误”。
我把它放到了 github 上: https://github.com/XtheOne/make-colorized
可以通过将需要替换的单词作为参数或在文件中进行配置来进一步开发。 但目前它对我们来说效果很好。
我有一个漂亮的.highlight 脚本
(可能是一个函数,因为它只有一行)
我用它来突出显示任何正则表达式,
所以它确实适用于任何输出。
$ cat ~/SCRIPTS/pretty.highlight
#!/bin/bash
sed "s/\($1\)/\x1b[7m\1\x1b[0m/"
$
请参阅示例用法的屏幕截图此处,其中我在邮件服务器日志上突出显示了 tail -f 命令中的域状态通知代码。
与 grep 颜色的区别在于,如果您使用 grep 它只会打印匹配的行,
而使用此解决方案,您可以获得整个输入,并突出显示所需的正则表达式。
这允许检查匹配下方/上方的行至任意级别。