У меня есть программа, которая выводит в stdout и stderr, но не использует их правильно.Некоторые ошибки идут в stdout, некоторые идут в stderr, не связанные с ошибками вещи идут в stderr, и он выводит много информации о stdout.Чтобы это исправить, я хочу сделать конвейер:
- Сохранить весь вывод
$cmd
(из stderr и stdout) в файл $logfile
(не выводить его на экран). - Отфильтровать все предупреждения и сообщения об ошибках в stderr и stdout (от предупреждения | ошибка до пустой строки) и раскрасить только слова «ошибки» (перенаправить вывод в stderr).
- Сохранить выводшаг 2 к файлу
$logfile:r.stderr
. - Выход с правильным кодом выхода из команды.
Пока у меня есть это:
$!/bin/zsh
# using zsh 4.2.0
setopt no_multios
# Don't error out if sed or grep don't find a match:
alias -g grep_err_warn="(sed -n '/error\|warning/I,/^$/p' || true)"
alias -g color_err="(grep --color -i -C 1000 error 1>&2 || true)"
alias -g filter='tee $logfile | grep_err_warn | tee $logfile:r.stderr | color_err'
# use {} around command to avoid possible race conditions:
{ eval $cmd } 2>&1 | filter
exit $pipestatus[1]
IЯ пробовал много вещей, но не могу заставить его работать.Я прочитал «От Bash до Z Shell», много постов и т. Д. В настоящее время у меня проблемы:
- Только фильтр входит в фильтр
Примечание: $cmd
- это сценарий оболочки, который вызывает двоичный файл с префиксом /usr/bin/time -p
.Похоже, это вызывает проблемы с конвейерами, и поэтому я обертываю команду в {…}
, весь вывод идет в конвейер.