Unix: задержка отображения stderr

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

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

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

3 ответа

Решение

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

#!/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 отключить это поведение, если хотите.

Я не уверен, как тебе будет легче.

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

Подобно ответу 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, я не проверял это.

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

rsync --progress 2> & 1
rsync --progress 2> & 1> file.out
Другие вопросы по тегам