Ausgabe unterdrücken, es sei denn, der Beendigungscode ist ungleich Null

19

Wie kann die Ausgabe (stdout und stderr) am besten unterdrückt werden, wenn das Programm nicht mit einem Code ungleich Null beendet wird? Ich denke:

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

Und renn, quiet_success my_long_noisy_script.shaber ich bin mir nicht sicher, ob es einen besseren Weg gibt. Ich habe das Gefühl, dass dies etwas sein muss, was andere Leute tun müssen.

Im Kontext möchte ich dies zu meinen Cron-Skripten hinzufügen, damit mir alles per E-Mail geschickt wird, wenn sie fehlschlagen, aber nicht, wenn sie es nicht tun.

dimo414
quelle
Dies sollte das Standardverhalten der meisten Befehle sein (keine Ausgabe bei Erfolg). Wenn nicht, müssen Sie zuerst nach einer Option / einem Schalter suchen, um ein solches Verhalten zu aktivieren. Gelingt dies nicht, ist Ihr Ansatz die richtige Idee. Randnotiz: Ich gehe davon aus, dass Sie Pseudo-Code gepostet haben, weil er keine gültige shSyntax ist und Ihre Umleitungsreihenfolge rückwärts ist ( > "$file" 2>&1verwenden Sie mehr Anführungszeichen).
JW013
Ja, ich habe es gerade in die Frage geschrieben. Wendet euren Vorschlag an, und ich stimme zu, der Befehl sollte dafür verantwortlich sein, aber leider ...
dimo414
Nur ein Hinweis zur Syntax: Der Befehl muss nicht in Klammern angegeben werden.
Manatwork

Antworten:

14

Sie müssen die Ausgabe irgendwo puffern, egal was passiert, da Sie auf den Exit-Code warten müssen, um zu wissen, was zu tun ist. So etwas ist wahrscheinlich am einfachsten:

$ output=`my_long_noisy_script.sh 2>&1` || echo $output
Michael Mrozek
quelle
Beachten Sie, dass, wenn Sie set -o xtracein Ihrem Shell-Skript verwenden, die gesamte Ausgabe im Rahmen der Protokollierung der Zuordnungsdetails erneut output=...angezeigt wird :-). In diesem Fall ist es wahrscheinlich besser zu verwenden chronic.
Jan-Philip Gehrcke
11

Das moreutilsPaket enthält ein Programm chronicfür diesen Zweck. Du nennst es einfach so

chronic my_program args ...

Sehr praktisch bei Cronjobs.

Peter Eisentraut
quelle
3
Seien Sie nicht wie ich und Fehler chronicfür cronic, die ein ähnliches Programm ist , dass die Ausgabe unterdrückt , wenn nicht ein Befehl mit einem Nicht-Null - Code vorhanden ist oder erzeugt Standard - Fehlerausgabe .
Witiko