Есть ли способ отображать сводку ошибок (из 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