¿Cuál es la mejor manera de suprimir la salida (stdout y stderr) a menos que el programa salga con un código distinto de cero? Estoy pensando:
quiet_success()
{
file=$(mktemp)
if ! "$@" > "$file" 2>&1; then
cat "$file"
fi
rm -f "$file"
}
Y corro quiet_success my_long_noisy_script.sh
pero no estoy seguro si hay una mejor manera. Siento que esto tiene que ser algo que otras personas han tenido que hacer.
Por contexto, estoy buscando agregar esto a mis scripts cron para que me envíen un correo electrónico con todo si fallan, pero no si no lo hacen.
shell-script
cron
io-redirection
dimo414
fuente
fuente
sh
sintaxis válida y su orden de redireccionamiento es al revés (> "$file" 2>&1
use y use más comillas).Respuestas:
Tendrá que almacenar en búfer la salida en cualquier lugar sin importar qué, ya que debe esperar el código de salida para saber qué hacer. Algo como esto es probablemente lo más fácil:
fuente
set -o xtrace
en su script de shell, toda la salida estará allí nuevamente como parte del registro de los detalles de la asignaciónoutput=...
:-). En ese caso, probablemente sea mejor usarlochronic
.El
moreutils
paquete contiene un programachronic
para este propósito. Solo lo llamas comoMuy útil en trabajos cron.
fuente
chronic
paracronic
, que es un programa similar que suprime la salida a menos que existe un comando con un código distinto de cero o produce una salida de error estándar .