Sıfır olmayan çıkış kodu olmadığı sürece çıkışı bastırın


19

Program sıfır olmayan bir kodla çıkmadığı sürece çıktıyı (stdout ve stderr) bastırmanın en iyi yolu nedir? Düşünüyorum:

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

Ve koş quiet_success my_long_noisy_script.shama daha iyi bir yol olup olmadığından emin değilim. Bunun diğer insanların yapması gereken bir şey olması gerektiğini hissediyorum.

Bağlam için, bunu cron scriptlerime eklemek istiyorum, böylece başarısız olursa her şeyle e-posta ile gönderiliyorum, ancak yapmazlarsa değil.


Bu, çoğu komutun varsayılan davranışı olmalıdır (başarı durumunda çıktı yok). Değilse, yapılacak ilk şey bu davranışı etkinleştirmek için bir seçenek / anahtar aramaktır. Bunu başaramazsanız, yaklaşımınız doğru fikirdir. Yan not: Sözde kod shsözdizimi olmadığı ve yeniden yönlendirme siparişinizin geriye doğru olduğu için sözde kod yayınladığınızı varsayıyorum ( > "$file" 2>&1daha fazla alıntı yapın ve kullanın).
jw013

Evet, sadece soruya yazdım. Önerinizi uyguladı ve katılıyorum, komut bundan sorumlu olmalı , ama ne yazık ki ...
dimo414

Sadece bir sözdizimi notu: komutun etrafında parantez gerekmez.
manatwork

Yanıtlar:


14

Ne olursa olsun çıktıyı tamponlamanız gerekecek, çünkü çıkış kodunun ne yapacağını bilmesi için beklemeniz gerekiyor. Böyle bir şey muhtemelen en kolay olanıdır:

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

set -o xtraceKabuk betiğinizde kullanırsanız , tüm çıktının, ödevin ayrıntılarını günlüğe kaydetmenin bir parçası olarak tekrar orada olacağını unutmayın output=...:-). Bu durumda, muhtemelen kullanmak daha iyidir chronic.
Jan-Philip Gehrcke

11

moreutilsPaket bir program içeren chronicbu amaçla. Sadece şöyle diyorsun

chronic my_program args ...

Cron işlerinde çok kullanışlı.


3
Benim gibi olma ve hata chronicyapma cronic, sıfır olmayan bir kodla bir komut yoksa veya standart hata çıktısı üretmedikçe çıktıyı bastıran benzer bir programdır .
Witiko
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.