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


19

プログラムがゼロ以外のコードで終了しない限り、出力(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スクリプトに追加して、失敗した場合はすべて送信し、失敗しない場合は送信しないようにしています。


これは、ほとんどのコマンドのデフォルトの動作である必要があります(成功した場合の出力はありません)。そうでない場合、最初に行うことは、そのような動作を有効にするオプション/スイッチを探すことです。それに失敗すると、あなたのアプローチは正しい考えです。サイドノート:擬似コードは実際には有効なsh構文ではなく、リダイレクトの順序は逆方向であるため、擬似コードを投稿したと想定しています(> "$file" 2>&1引用符を追加して使用してください)。
jw013

うん、質問にタイプしただけだ。あなたの提案を適用し、そして私は、コマンドが、同意しなければならないことに責任がある、悲しいかな...
dimo414

構文に関する注意事項:コマンドを括弧で囲む必要はありません。
マナトワーク

回答:


14

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

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

set -o xtraceシェルスクリプトで使用する場合、割り当ての詳細のログ記録の一部として、すべての出力が再び存在することに注意してくださいoutput=...:-)。その場合は、おそらくを使用しchronicた方が良いでしょう。
Jan-Philip Gehrcke

11

moreutilsパッケージには、プログラムが含まれchronic、この目的のために。あなたはそれを次のように呼ぶだけです

chronic my_program args ...

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


3
私と間違いのようであってはならないchronicためcronic、コマンドがゼロ以外のコードで存在しない限り出力を抑制同様のプログラムである、または標準エラー出力を生成します
ウィティコ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.