Grepping Make Output

时间:2013-09-18 13:43:40

标签: grep makefile

当尝试从make过滤特定警告或错误消息的非常长的输出时,第一个想法是这样的:

$ make | grep -i 'warning: someone set up us the bomb'

但结果并不完全令人满意。输出不仅包含来自grep的过滤结果,还包含来自stdout目标中某处使用的其他工具的stderrmake条消息。

现在的问题是:

  1. 其他输出来自哪里?
  2. 如何编写输出只包含过滤行的过滤器命令?

3 个答案:

答案 0 :(得分:8)

回答问题:

  1. 该管道仅将stdout make连接到grep的stdinmake的{​​{1}}仍然连接到终端,因此无需过滤即可打印。
  2. 解决方案是将stderr的{​​{1}}与make联系起来并忽略stderr

    stdin
  3. 这只打印grep的输出,但没有来自make或其他工具,如stdin

答案 1 :(得分:2)

我只是想看看编译器发出的警告。使用make的silent选项让我接近我想要的地方。

来自make man页面:

-s, --silent, --quiet                                                                                                                       
Silent operation; do not print the commands as they are executed.

我仍然想要忽略大量的编译器警告,所以当我调用make时设置CFLAGS

例如:

make -s CFLAGS="-Wno-deprecated-declarations"

如果您正在使用libtool,这也非常有用

make LIBTOOLFLAGS='--silent' --quiet

如果我只对特定文件或文件集感兴趣,我会使用touch命令,然后使用静音make。

触摸foo.c; make -s CFLAGS =" -Wno-deprecated-declarations"

最初我开始尝试grep make输出,但是静默调用make,控制编译警告和触摸文件以限制编译更加清晰。毕竟,你仍然可以使用grep,但我会首先看一下构建系统和编译器手册。

答案 2 :(得分:0)

排除stderr:

make 2>/dev/null | grep -i 'warning: someone set up us the bomb'

实施例

$ ls
hello
$ ls hello bye
ls: cannot access bye: No such file or directory # <--- this is stderr
hello
$ ls hello bye 2>/dev/null # <--- stderr are sent to /dev/null, so don't appear
hello

如评论中所示,所有make输出都以stderr的形式给出,因此第一个解决方案根本不匹配。因此我的建议是使用以下内容:

make 2> >(tee make_output.log >&2)

然后grep make_output.log。如How do I write stderr to a file while using “tee” with a pipe?上所见。

实施例

$ ls aaa
ls: cannot access aaa: No such file or directory
$ ls aaa 2> >(tee stderr.log >&2)
ls: cannot access aaa: No such file or directory
$ cat stderr.log 
ls: cannot access aaa: No such file or directory