Sopprime l'output a meno che il codice di uscita sia diverso da zero


19

Qual è il modo migliore per sopprimere l'output (stdout e stderr) a meno che il programma non esca con un codice diverso da zero? Sto pensando:

quiet_success()
{
  file=$(mktemp)
  if ! "$@" > "$file" 2>&1; then
    cat "$file"
  fi
  rm -f "$file"
}

E corri quiet_success my_long_noisy_script.shma non sono sicuro che ci sia un modo migliore. Sento che questo deve essere qualcosa che altre persone hanno dovuto fare.

Per il contesto, sto cercando di aggiungere questo ai miei script cron in modo da ricevere un'email con tutto se falliscono, ma non se non lo fanno.


Questo dovrebbe essere il comportamento predefinito della maggior parte dei comandi (nessun output in caso di successo). In caso contrario, la prima cosa da fare è cercare un'opzione / interruttore per abilitare tale comportamento. In caso contrario, il tuo approccio è l'idea giusta. Nota a margine: suppongo che tu abbia pubblicato uno pseudo-codice perché non è in realtà una shsintassi valida e il tuo ordine di reindirizzamento è al contrario (fai > "$file" 2>&1e usa più virgolette).
jw013,

Sì, l'ho appena scritto nella domanda. Ho applicato il tuo suggerimento, e sono d'accordo, il comando dovrebbe esserne responsabile, ma purtroppo ...
dimo414

Solo una nota di sintassi: nessuna necessità di parentesi attorno al comando.
arte

Risposte:


14

Dovrai bufferizzare l'output da qualche parte, non importa cosa, dal momento che devi aspettare che il codice di uscita sappia cosa fare. Qualcosa del genere è probabilmente il più semplice:

$ output=`my_long_noisy_script.sh 2>&1` || echo $output

Nota che se usi set -o xtracenello script della shell, tutto l'output sarà di nuovo lì come parte della registrazione dei dettagli del compito output=...:-). In tal caso è probabilmente meglio usarlo chronic.
Jan-Philip Gehrcke,

11

Il moreutilspacchetto contiene un programma chronicper questo scopo. Lo chiami così

chronic my_program args ...

Molto utile nei lavori cron.


3
Non essere come me e errore chronicper cronic, che è un programma simile che sopprime uscita a meno che non esista un comando con un codice diverso da zero o produce un output di errore standard .
Witiko,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.