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.


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

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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.