shell 如何突出显示make输出中的警告和错误行?

tnkciper  于 2022-11-25  发布在  Shell
关注(0)|答案(9)|浏览(122)

有时候,make的输出会填满屏幕。要识别所有的警告和错误消息行有点困难。我知道shell颜色输出可能会有帮助。有人能帮我吗?

zpqajqem

zpqajqem1#

看一下colormake,找到了here

$ apt-cache search colormake
colormake - simple wrapper around make to colorize output

利用谷歌的力量,我还发现了这个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]}
}
lndjwyie

lndjwyie2#

我已经来到这个问题寻找一个解决方案来着色make输出,然后记得前一段时间我已经研究了一个很好的通用日志着色器,并发现ccze。它的工作与任何我扔在它从Minecraft服务器日志到Exim MTA。
make | ccze -A

  • 注意 *:指定-A选项会启用'raw-ansi',否则根据我的经验,某些输出会在执行结束时'cleared'。x1c 0d1x
wd2eg0qa

wd2eg0qa3#

如果你是emacs用户,你可以使用命令M-x compile,这会把make输出放在一个突出显示的缓冲区中,错误作为指向源代码中相关行的链接。

zvokhttg

zvokhttg4#

只是另一个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]}
}
2w3kk1z5

2w3kk1z55#

下面的呢?

它由this 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目录中。

8yparm6h

8yparm6h6#

我曾经对日志文件使用multitail,它可以根据各种标准突出显示(和过滤)行。

nnt7mjpx

nnt7mjpx7#

在Mac上,它通过在错误字符串周围打印tput颜色代码来工作。
第一个export tput颜色代码如下:

export red=`tput setaf 1`
export reset=`tput sgr0`

然后,向Makefile添加一个目标,如下所示:

...
check-env:
ifndef ENV
    $(error ${red}ENV is undefined. Please export it using command [ export ENV=dev ]${reset})
endif
...

然后以make check-env形式运行
屏幕截图-x1c 0d1x

oalqel3c

oalqel3c8#

GCC有一个环境变量:

export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'
zpqajqem

zpqajqem9#

我最近为我们的团队研究了这个问题,我修改了make的源代码,以生成输出,其中CL.EXE(Windows)输出使用ANSI转义码以颜色显示文本“警告”和“错误”。
我把它放在github这里:https://github.com/XtheOne/make-colorized
它还可以进一步发展,把需要替换的单词作为参数或文件来配置,但现在它对我们来说还不错。

相关问题