Придушити вихід, якщо не нульовий код виходу


19

Який найкращий спосіб придушити вихід (stdout і stderr), якщо програма не завершиться з ненульовим кодом? Я маю на увазі:

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

І біжи, quiet_success my_long_noisy_script.shале я не впевнений, чи є кращий спосіб. Я відчуваю, що це має бути те, що потрібно було робити іншим людям.

Для контексту я хочу додати це до своїх сценаріїв cron, щоб я отримав електронне повідомлення зі всім, якщо вони не вдаються, але не, якщо вони цього не роблять.


Це має бути поведінка більшості команд за замовчуванням (відсутність результату на успіх). Якщо ні, то перше, що потрібно зробити, це шукати варіант / перемикач, щоб увімкнути таку поведінку. Якщо цього не зробити, ваш підхід - це правильна ідея. Побічна примітка: Я припускаю, що ви розмістили псевдо-код, оскільки він насправді не є дійсним shсинтаксисом, а ваш порядок переадресації є зворотним (зробіть > "$file" 2>&1і використовуйте більше лапок).
jw013

Так, я просто набрав це питання. Застосував вашу пропозицію, і я згоден, команда повинна відповідати за це, але на жаль ...
dimo414

Просто синтаксична примітка: немає потреби в дужках навколо команди.
манатура

Відповіді:


14

Вам доведеться десь забудувати вихід, незважаючи ні на що, оскільки вам потрібно чекати виходу коду, щоб знати, що робити. Щось подібне, мабуть, найпростіше:

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

Зауважте, що якщо ви використовуєте set -o xtraceв своєму скрипті оболонки, то весь результат знову буде там, як частина реєстрації реквізитів завдання output=...:-). У такому випадку це, мабуть, краще використовувати chronic.
Ян-Філіп Геркер

11

moreutilsПакет містить програму chronicдля цієї мети. Ви просто так називаєте

chronic my_program args ...

Дуже зручно в роботі з крон.


3
Не як я і помилки chronicдля cronic, що подібна програма , яка пригнічує висновок , якщо команда існує з кодом ненульовим або виробляє стандартний висновок помилок .
Вітіко
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.