【问题标题】:What is the best to detect stderr output and stop make检测stderr输出并停止make的最佳方法是什么
【发布时间】:2015-10-24 00:19:54
【问题描述】:

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

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消息。

【问题讨论】:

  • false 只设置返回状态。也许您希望exit 1 终止处理?祝你好运。

标签: shell makefile


【解决方案1】:

你可以告诉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 ]

获得同样的效果。

【讨论】:

    【解决方案2】:

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

    如果你只是想测试是否正在产生任何输出,你可以使用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 有输出文件和输入文件,也将它们设为目标和依赖项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-05
      • 1970-01-01
      • 2020-12-06
      • 1970-01-01
      • 2019-01-26
      相关资源
      最近更新 更多