Jaki jest najlepszy sposób tłumienia wyjścia (stdout i stderr), chyba że program zakończy działanie z niezerowym kodem? Myślę:
quiet_success()
{
file=$(mktemp)
if ! "$@" > "$file" 2>&1; then
cat "$file"
fi
rm -f "$file"
}
I biegnij, quiet_success my_long_noisy_script.sh
ale nie jestem pewien, czy jest lepszy sposób. Wydaje mi się, że muszą to zrobić inni ludzie.
Dla kontekstu, chcę dodać to do moich skryptów cron, aby otrzymać e-mailem wszystko, jeśli się nie powiedzie, ale nie, jeśli nie.
shell-script
cron
io-redirection
dimo414
źródło
źródło
sh
składnią, a twoje polecenie przekierowania jest odwrócone (wykonaj> "$file" 2>&1
i użyj więcej cudzysłowów).Odpowiedzi:
Będziesz musiał buforować dane wyjściowe gdziekolwiek, bez względu na wszystko, ponieważ musisz poczekać, aż kod wyjścia będzie wiedział, co robić. Coś takiego jest prawdopodobnie najłatwiejsze:
źródło
set -o xtrace
w swoim skrypcie powłoki, wszystkie dane wyjściowe będą tam ponownie w ramach rejestrowania szczegółów zadaniaoutput=...
:-). W takim przypadku prawdopodobnie lepiej jest użyćchronic
.moreutils
Pakiet zawiera programchronic
do tego celu. Po prostu to nazywacieBardzo przydatny w pracach cron.
źródło
chronic
zacronic
, który jest podobny program, który hamuje wyjście, chyba że istnieje polecenia z kodem niezerowym lub produkuje standardowe wyjście błędu .