Suprime la salida a menos que el código de salida no sea cero

19

¿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.shpero 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.

dimo414
fuente
Este debería ser el comportamiento predeterminado de la mayoría de los comandos (sin salida en caso de éxito). Si no, lo primero que debe hacer es buscar una opción / interruptor para habilitar dicho comportamiento. De lo contrario, su enfoque es la idea correcta. Nota al margen: supongo que publicó un pseudocódigo porque no es una shsintaxis válida y su orden de redireccionamiento es al revés ( > "$file" 2>&1use y use más comillas).
jw013
Sí, lo escribí en la pregunta. Apliqué tu sugerencia, y estoy de acuerdo, el comando debería ser responsable de eso, pero por desgracia ...
dimo414
Solo una nota de sintaxis: no hay necesidad de paréntesis alrededor del comando.
manatwork

Respuestas:

14

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:

$ output=`my_long_noisy_script.sh 2>&1` || echo $output
Michael Mrozek
fuente
Tenga en cuenta que si usa set -o xtraceen su script de shell, toda la salida estará allí nuevamente como parte del registro de los detalles de la asignación output=...:-). En ese caso, probablemente sea mejor usarlo chronic.
Jan-Philip Gehrcke
11

El moreutilspaquete contiene un programa chronicpara este propósito. Solo lo llamas como

chronic my_program args ...

Muy útil en trabajos cron.

Peter Eisentraut
fuente
3
No sea como yo y error chronicpara cronic, 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 .
Witiko