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.


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

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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.