0

私はfooどちらかができるプログラムを持っています

  1. 成功した;
  2. 印刷Failureして失敗します。
  3. または何か他のものを印刷して失敗します。

foo && barcron で実行する短いスクリプトがあります。ケース 2 はほとんどの場合に当てはまるため、私のメールボックスは cron からの「失敗」メッセージであふれています。

成功からの通知と他のメッセージでの失敗からの通知を保持する「失敗」通知の取得を停止したい。

wrap_fooのように動作するfooが出力しないbash 関数を作成しようとしましたFailure。このようなもの:

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

ただし、常に失敗するため、成功したbar場合は実行されません。foo

1つの方法は等価テストの$(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 に答える