0

我有一个foo程序可以

  1. 成功;
  2. 打印Failure失败;
  3. 或打印其他内容并失败。

我有一个foo && bar由 cron 运行的简短脚本。情况 2 几乎总是如此,所以我的邮箱被来自 cron 的“失败”消息淹没了。

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

我试图编写一个wrap_foo行为类似于foo但不打印的 bash 函数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
}

能不能短一点?

4

1 回答 1

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

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

于 2013-01-29T14:32:51.363 回答