web-dev-qa-db-ja.com

ゼロ以外の終了コードでない限り、出力を抑制します

プログラムがゼロ以外のコードで終了しない限り、出力(stdoutおよびstderr)を抑制する最善の方法は何ですか?考えている:

quiet_success()
{
  file=$(mktemp)
  if ! "$@" > "$file" 2>&1; then
    cat "$file"
  fi
  rm -f "$file"
}

そしてquiet_success my_long_noisy_script.shを実行しますが、もっと良い方法があるかどうかはわかりません。これは他の人がやらなければならないことだと思います。

コンテキストについては、これを自分のcronスクリプトに追加して、失敗した場合はすべてのメールが送信されるようにしますが、失敗しない場合は送信しません。

19
dimo414

終了コードが何をすべきかを知るのを待つ必要があるので、何があっても出力をどこかにバッファリングする必要があります。このようなものがおそらく最も簡単です:

$ output=`my_long_noisy_script.sh 2>&1` || echo $output
14
Michael Mrozek

moreutils パッケージには、この目的のためのプログラム chronic が含まれています。あなたはただそれを

chronic my_program args ...

Cronジョブで非常に便利です。

11