Pomiń wyjście, chyba że niezerowy kod wyjścia

19

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.shale 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.

dimo414
źródło
Takie powinno być domyślne zachowanie większości poleceń (brak wyników w przypadku powodzenia). Jeśli nie, najpierw należy poszukać opcji / przełącznika umożliwiającego takie zachowanie. W przeciwnym razie twoje podejście jest właściwym pomysłem. Uwaga dodatkowa: Zakładam, że opublikowałeś pseudo-kod, ponieważ tak naprawdę nie jest on prawidłową shskładnią, a twoje polecenie przekierowania jest odwrócone (wykonaj > "$file" 2>&1i użyj więcej cudzysłowów).
jw013
Tak, właśnie wpisałem to w pytaniu. Zastosowałem twoją sugestię i zgadzam się, że to polecenie powinno być za to odpowiedzialne, ale niestety ...
dimo414
Tylko uwaga składniowa: nie trzeba nawiasów wokół polecenia.
manatwork

Odpowiedzi:

14

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:

$ output=`my_long_noisy_script.sh 2>&1` || echo $output
Michał Mrożek
źródło
Zauważ, że jeśli użyjesz set -o xtracew swoim skrypcie powłoki, wszystkie dane wyjściowe będą tam ponownie w ramach rejestrowania szczegółów zadania output=...:-). W takim przypadku prawdopodobnie lepiej jest użyć chronic.
Jan-Philip Gehrcke,
11

moreutilsPakiet zawiera program chronicdo tego celu. Po prostu to nazywacie

chronic my_program args ...

Bardzo przydatny w pracach cron.

Peter Eisentraut
źródło
3
Nie bądź jak ja i pomyłkę chronicza cronic, który jest podobny program, który hamuje wyjście, chyba że istnieje polecenia z kodem niezerowym lub produkuje standardowe wyjście błędu .
Witiko