选择性抑制输出保留退出代码

时间:2013-01-29 09:07:28

标签: shell error-handling cron grep

我有一个foo程序,可以

  1. 成功;
  2. 打印Failure并失败;
  3. 或打印其他内容并失败。
  4. 我有一个由cron运行的短脚本foo && bar。案例2几乎总是如此,所以我的邮箱充斥着来自cron的“失败”消息。

    我想停止获取“失败”通知,保留成功通知和其他消息失败的通知。

    我尝试编写一个bash函数wrap_foo,其行为类似foo但不打印Failure。像这样:

    wrap_foo() {
        foo | grep -vF "Failure"
    }
    wrap_foo && bar
    

    但它始终失败,因此如果bar成功,则不会执行foo

    一种方式似乎是$(foo)上的等式测试,但我想尽可能避免它,因为输出可能很长。

    我应该使用mktemp并重定向foo输出吗?如果没有更简单的方法,我如何保存foo失败状态并在删除临时文件后恢复它?

    这是一个测试套件:

    foo_failed() {
            echo Failed
            false
    }
    
    foo_false() {
            echo Error
            false
    }
    
    foo_true() {
            echo Something
            true
    }
    
    bar() {
            echo bar
            true
    }
    
    wrap_foo()
    {
            $1 | grep -vF Failed
    }
    
    run() {
            wrap_foo $1 && bar
    }
    
    echo should not write anything
    run foo_failed
    echo should write Error
    run foo_false
    echo should write Something then bar
    run foo_true
    

    这是一个带有临时文件的解决方案:

    wrap_foo()
    {
            T=$(mktemp)
            $1 >$T
            X=$?
            grep -vF Failed $T
            rm $T
            return $X
    }
    

    可以缩短吗?

1 个答案:

答案 0 :(得分:0)

使用您的测试套件,我将wrap_foo()功能修改为以下内容,这似乎有效:

wrap_foo()
{
        foooutput=$($1)
        foostatus="$?"
        echo "$foooutput" | grep -vF Failed
        return "$foostatus"
}

输出:

should not write anything
should write Error
Error
should write Something then bar
Something
bar

它只是有点短,但没有涉及临时文件。