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.sh
mas 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.
shell-script
cron
io-redirection
dimo414
fonte
fonte
sh
sintaxe válida e seu pedido de redirecionamento é inverso (faça> "$file" 2>&1
e use mais aspas).Respostas:
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:
fonte
set -o xtrace
o script shell, toda a saída estará lá novamente como parte do registro dos detalhes da atribuiçãooutput=...
:-). Nesse caso, provavelmente é melhor usarchronic
.O
moreutils
pacote contém um programachronic
para esse fim. Você apenas chama assimMuito útil em tarefas cron.
fonte
chronic
paracronic
, 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 .