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.sh
mais 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.
shell-script
cron
io-redirection
dimo414
la source
la source
sh
syntaxe valide , et votre ordre de redirection est à l'envers (faites> "$file" 2>&1
et utilisez plus de guillemets).Réponses:
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:
la source
set -o xtrace
dans votre script shell, toutes les sorties seront à nouveau présentes dans le cadre de la journalisation des détails de l'affectationoutput=...
:-). Dans ce cas, il est probablement préférable d'utiliserchronic
.Le
moreutils
paquet contient un programmechronic
à cet effet. Tu l'appelles juste commeTrès pratique dans les tâches cron.
la source
chronic
aveccronic
, 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 .