Menekan output kecuali kode keluar non-nol

19

Apa cara terbaik untuk menekan output (stdout dan stderr) kecuali program keluar dengan kode bukan nol? Saya berpikir:

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

Dan jalankan quiet_success my_long_noisy_script.shtetapi saya tidak yakin apakah ada cara yang lebih baik. Saya merasa ini harus menjadi sesuatu yang harus dilakukan orang lain.

Untuk konteks, saya ingin menambahkan ini ke skrip cron saya sehingga saya bisa diemail dengan semuanya jika gagal, tetapi tidak jika tidak.

dimo414
sumber
Ini harus menjadi perilaku default sebagian besar perintah (tidak ada output yang berhasil). Jika tidak, hal pertama yang harus dilakukan adalah mencari opsi / saklar untuk mengaktifkan perilaku tersebut. Jika gagal, pendekatan Anda adalah ide yang tepat. Catatan: Saya berasumsi Anda memposting kode semu karena sebenarnya bukan shsintaks yang valid , dan urutan pengalihan Anda mundur (lakukan > "$file" 2>&1dan gunakan lebih banyak kutipan).
jw013
Yap, saya baru saja mengetiknya di pertanyaan. Menerapkan saran Anda, dan saya setuju, perintah harus bertanggung jawab untuk itu, tetapi sayangnya ...
dimo414
Hanya catatan sintaks: tidak perlu tanda kurung di sekitar perintah.
manatwork

Jawaban:

14

Anda harus buffer output di suatu tempat tidak peduli apa, karena Anda harus menunggu kode keluar untuk mengetahui apa yang harus dilakukan. Sesuatu seperti ini mungkin paling mudah:

$ output=`my_long_noisy_script.sh 2>&1` || echo $output
Michael Mrozek
sumber
Perhatikan bahwa jika Anda menggunakan set -o xtraceskrip shell Anda maka semua output akan ada lagi sebagai bagian dari pendataan detail tugas output=...:-). Dalam hal ini mungkin lebih baik digunakan chronic.
Jan-Philip Gehrcke
11

The moreutilspaket berisi program chronicuntuk tujuan ini. Anda hanya menyebutnya seperti

chronic my_program args ...

Sangat berguna dalam pekerjaan cron.

Peter Eisentraut
sumber
3
Jangan seperti saya dan kesalahan chronicuntuk cronic, yang merupakan program serupa yang menekan output kecuali ada perintah dengan kode non-nol atau menghasilkan output kesalahan standar .
Witiko