У меня есть программа, которая выводит на stdout и stderr, но не использует их должным образом. Некоторые ошибки отправляются на стандартный вывод, некоторые - на стандартный вывод, а не ошибки поступают на стандартный вывод и выводят много информации на стандартный вывод. Чтобы исправить это, я хочу сделать конвейер:
- Сохраните весь вывод
$cmd
(как из stderr, так и из stdout) в файл$logfile
(не выводите его на экран). - Отфильтруйте все предупреждения и сообщения об ошибках на stderr и stdout (от warning | error до пустой строки) и раскрасьте только «ошибочные» слова (перенаправьте вывод на 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]
Я много чего пробовал, но не могу заставить работать. Я прочитал «От Bash к Z Shell», много сообщений и т. Д. В настоящее время у меня возникают следующие проблемы:
- В фильтр попадает только стандартный ввод
Примечание: $cmd
- это сценарий оболочки, который вызывает двоичный файл с префиксом /usr/bin/time -p
. Похоже, это вызывает проблемы с конвейерами, и поэтому я помещаю команду в {…}
, весь вывод идет в конвейер.