Supprimer la sortie sauf code de sortie différent de zéro

19

Quelle est la meilleure façon de supprimer la sortie (stdout et stderr) à moins que le programme ne se termine avec un code différent de zéro? Je pense:

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

Et courez, quiet_success my_long_noisy_script.shmais je ne sais pas s'il y a une meilleure façon. J'ai l'impression que cela doit être quelque chose que d'autres personnes ont dû faire.

Pour le contexte, je cherche à ajouter cela à mes scripts cron afin que je reçoive un e-mail avec tout s'ils échouent, mais pas s'ils ne le font pas.

dimo414
la source
Cela devrait être le comportement par défaut de la plupart des commandes (pas de sortie en cas de succès). Sinon, la première chose à faire est de rechercher une option / un commutateur pour activer un tel comportement. A défaut, votre approche est la bonne idée. Note latérale: Je suppose que vous avez publié un pseudo-code car ce n'est pas réellement une shsyntaxe valide , et votre ordre de redirection est à l'envers (faites > "$file" 2>&1et utilisez plus de guillemets).
jw013
Oui, je viens de le taper dans la question. Appliqué votre suggestion, et je suis d'accord, la commande devrait en être responsable, mais hélas ...
dimo414
Juste une note de syntaxe: pas besoin de parenthèses autour de la commande.
manatwork

Réponses:

14

Vous devrez mettre la sortie en mémoire tampon quelque part, car vous devez attendre le code de sortie pour savoir quoi faire. Quelque chose comme ça est probablement le plus simple:

$ output=`my_long_noisy_script.sh 2>&1` || echo $output
Michael Mrozek
la source
Notez que si vous utilisez set -o xtracedans votre script shell, toutes les sorties seront à nouveau présentes dans le cadre de la journalisation des détails de l'affectation output=...:-). Dans ce cas, il est probablement préférable d'utiliser chronic.
Jan-Philip Gehrcke
11

Le moreutilspaquet contient un programme chronicà cet effet. Tu l'appelles juste comme

chronic my_program args ...

Très pratique dans les tâches cron.

Peter Eisentraut
la source
3
Ne soyez pas comme moi et confondez chronicavec cronic, qui est un programme similaire qui supprime la sortie sauf si une commande existe avec un code non nul ou produit une sortie d'erreur standard .
Witiko