Подавить вывод, если не нулевой код выхода

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, чтобы получать по электронной почте все, если они терпят неудачу, но не если они этого не делают.

dimo414
источник
Это должно быть поведение по умолчанию для большинства команд (без вывода при успешном выполнении). Если нет, первое, что нужно сделать, это найти параметр / переключатель, чтобы включить такое поведение. В противном случае ваш подход - правильная идея. Примечание: я предполагаю, что вы разместили псевдокод, потому что он на самом деле не является допустимым shсинтаксисом, а ваш порядок перенаправления обратный (делайте > "$file" 2>&1и используйте больше кавычек).
jw013
Да, я просто напечатал это в вопросе. Применил ваше предложение, и я согласен, команда должна нести ответственность за это, но увы ...
dimo414
Просто примечание синтаксиса: нет необходимости в скобках вокруг команды.
manatwork

Ответы:

14

Вам придется где-то буферизовать вывод, несмотря ни на что, так как вам нужно дождаться, пока код завершения не будет знать, что делать. Примерно так, наверное, проще всего:

$ output=`my_long_noisy_script.sh 2>&1` || echo $output
Михаил Мрозек
источник
Обратите внимание, что если вы используете set -o xtraceв своем сценарии оболочки, то все выходные данные будут там снова, как часть регистрации деталей назначения output=...:-). В этом случае, вероятно, лучше использовать chronic.
Ян-Филипп Герке
11

moreutilsПакет содержит программу chronicдля этой цели. Вы просто называете это как

chronic my_program args ...

Очень удобно в работе cron.

Питер Айзентраут
источник
3
Не будь таким, как я, и заблуждайся, chronicпотому cronicчто это похожая программа, которая подавляет вывод, если команда не существует с ненулевым кодом или не выводит стандартную ошибку .
Witiko