Где prepend
печатает вывод? В stderr
или в stdout
? Я думаю, что замена процесса в cmd 2> >(procsub) | ...
наследует перенаправление stdout
, установленное каналом.
Вам нужно будет сделать что-то подобное, чтобы явно перенаправить вывод команды подстановки процесса на stderr
снова:
cmd 2> >(procsub >&2) | pipecmd
или заменить трубу другой заменой процесса:
cmd 2> >(procsub) 1> >(pipecmd)
Последний вариант кажется мне чище, но в этом случае весь результирующий вывод идет вstdout
(внешней среды ), и, по крайней мере, мой Bash возвращается к подсказке до завершения замены процесса, поэтому вывод смешивается с подсказкой.
Первый вариант работает:
$ bash someoutput.sh 2> >(sed -e 's/^/ERR:/' >&2) | sed -e 's/^/OUT:/'
ERR:error message
OUT:normal output
Но помните, что после перенаправления первоначальный порядок вывода ошибки и нормального вывода может не остаться в конце. Мой скрипт выше на самом деле сначала напечатал строку normal output
, но иногда сначала появляется строка с ошибкой, как указано выше.