当尝试从make过滤特定警告或错误消息的非常长的输出时,第一个想法是这样的:
$ make | grep -i 'warning: someone set up us the bomb'
但结果并不完全令人满意。输出不仅包含来自grep
的过滤结果,还包含来自stdout
目标中某处使用的其他工具的stderr
和make
条消息。
现在的问题是:
答案 0 :(得分:8)
回答问题:
stdout
make
连接到grep的stdin
。 make
的{{1}}仍然连接到终端,因此无需过滤即可打印。解决方案是将stderr
的{{1}}与make
联系起来并忽略stderr
stdin
这只打印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