什么是检测stderr输出和停止make的最佳选择

时间:2015-10-24 00:19:54

标签: shell makefile

我的Makefile运行一个程序,当它在输入文件中发现问题时,只是将错误消息转储到stderr但仍返回零。这是Makefile片段:

target:
    prog1 -i input1 input2 -o out.txt
    prog2

" PROG1"是程序,这是我的修复:

target:
    prog1 -i input1 input2 -o out.txt  2>&1  1>/dev/null | tee err_log
    if [ -s err_log ]; then false ; fi
    prog2 

基本上我将stderr重定向到文件err_log并检测err_log是否为空。我还希望错误消息显示在控制台中。

这些都有效,但有一个小麻烦:false命令,if [ -s err_log ]; then false ; fi在控制台中显示,它位于控制台的末尾。

我想知道如果在虚假命令的地方,我可以停止制作,但没有消息进入控制台?基本上我最后想要stderr消息。

2 个答案:

答案 0 :(得分:0)

您可以通过在配方行前添加make字符来告诉@不打印它运行的命令:

target:
        prog1 -i input1 input2 -o out.txt  2>&1  1>/dev/null | tee err_log
        @if [ -s err_log ]; then false ; fi
        prog2

仅供参考,你可以使用:

        @[ ! -s err_log ]

获得相同的效果。

答案 1 :(得分:0)

使用尽可能少的辅助文件。它们是您可能需要制定解决方法的其他问题的来源。

如果您只想测试是否正在生成任何输出,可以使用grep

您还需要将输出文件声明为目标,并将输入文件声明为依赖项。

所以这应该可以解决问题:

out.txt: input1 input2
    prog1 -i $+ -o $@ 2>&1 | grep -q .
    prog2

但是,您应该有一个单独的规则来运行prog2,因为它可能取决于out.txt。像

这样的东西
out.txt: input1 input2
    prog1 -i $+ -o $@ 2>&1 | grep -q .

whatever: out.txt
    prog2

如果prog2拥有并输出文件和输入文件,请将它们作为目标和依赖项。