Suprimir saída, a menos que código de saída diferente de zero

19

Qual é a melhor maneira de suprimir a saída (stdout e stderr), a menos que o programa saia com um código diferente de zero? Estou pensando:

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

E corra, quiet_success my_long_noisy_script.shmas não tenho certeza se há uma maneira melhor. Eu sinto que isso tem que ser algo que outras pessoas precisam fazer.

Por contexto, pretendo adicionar isso aos meus scripts cron para que eu receba um e-mail com tudo se eles falharem, mas não se não o fizerem.

dimo414
fonte
Esse deve ser o comportamento padrão da maioria dos comandos (sem saída com êxito). Caso contrário, a primeira coisa a fazer é procurar uma opção / opção para ativar esse comportamento. Caso contrário, sua abordagem é a idéia certa. Nota lateral: Suponho que você postou pseudocódigo porque na verdade não é uma shsintaxe válida e seu pedido de redirecionamento é inverso (faça > "$file" 2>&1e use mais aspas).
jw013
Sim, eu apenas digitei na pergunta. Aplicado a sua sugestão, e eu concordo, o comando deve ser responsável por isso, mas infelizmente ...
dimo414
Apenas uma nota de sintaxe: não há necessidade de parênteses ao redor do comando.
manatwork

Respostas:

14

Você terá que armazenar em buffer a saída em algum lugar, não importa o que aconteça, pois você precisa esperar o código de saída para saber o que fazer. Algo assim é provavelmente mais fácil:

$ output=`my_long_noisy_script.sh 2>&1` || echo $output
Michael Mrozek
fonte
Observe que, se você usar set -o xtraceo script shell, toda a saída estará lá novamente como parte do registro dos detalhes da atribuição output=...:-). Nesse caso, provavelmente é melhor usar chronic.
Jan-Philip Gehrcke
11

O moreutilspacote contém um programa chronicpara esse fim. Você apenas chama assim

chronic my_program args ...

Muito útil em tarefas cron.

Peter Eisentraut
fonte
3
Não seja como eu e erro chronicpara cronic, que é um programa semelhante que suprime saída a menos que um comando existe com um código diferente de zero ou produz saída de erro padrão .
Witiko