Назад | Перейти на главную страницу

Unix: отложенное отображение stderr

Есть ли способ отображать сводку ошибок (из stderr) после завершения приложения?

Например. rsync с "--progress" отображает МНОГО данных, включая ошибки. Но когда заканчивает - просто пишет «были ошибки». Я хочу отобразить все, что было написано в stderr в этом случае, поэтому мне не нужно прокручивать и искать, что именно пошло не так :)

P.S. Я знаю, как просто написать такую ​​утилиту на C, но думаю, могут быть и более удобные вещи, о которых я не знаю :)

Подобно ответу womble, вы можете написать сценарий bash примерно так:

#!/bin/sh

set -e

TMPFILE=$(mktemp)

exec 2>$TMPFILE
trap 'cat "$TMPFILE"; rm -f "$TMPFILE" exit $?' INT TERM EXIT

command1
command2
command3

и это должно сохранить все, что отправлено в stderr для всего скрипта, и вывести его в конце. Как и в случае с ответом womble, я этого не тестировал.

Скрипт-оболочка для этого:

#!/bin/sh

TMPFILE=$(mktemp)

"$@" 2>$TMPFILE

if [ "$?" != "0" ]; then
  cat $TMPFILE
fi

Если вы сохраните это в /usr/local/bin/delaystderr и chmod +x /usr/local/bin/delaystderr, вы должны иметь возможность работать как delaystderr rsync --progress. Если процесс завершается без сообщения об ошибке (возвращается ненулевое значение), stderr не будет напечатан; вы можете удалить строки, начинающиеся с if и fi чтобы отключить это поведение, если хотите.

Я не уверен, что может быть проще.

(Примечание: я на самом деле не тестировал этот сценарий, поэтому покупатель остерегается и все такое)

Если вы используете bash redirect stderr to stdout, то, необязательно, перенаправьте его в файл:

rsync --progress 2>&1
rsync --progress 2>&1 > file.out