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


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

Просто примечание синтаксиса: нет необходимости в скобках вокруг команды.
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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.