Отдельные конвейеры (pipelines) для stdout и stderr в окружении POSIX

Предположим, в окружении POSIX есть программа типа:

echo "stdout good"
echo "stdout bad"
echo "STDERR GOOD" 1>&2
echo "STDERR BAD" 1>&2

Мне нужно, чтобы в stdout и stderr получилось соответственно:

stdout good
STDERR GOOD

То есть, нужно перенаправить stdout и stderr в два разных фильтра, сохраняя порядок вывода. Простой 2>&1 использовать нельзя, ибо нельзя смешивать два потока. Перенаправление stderr в файл с последующей фильтрацией и выводом в stderr тоже нельзя, так как теряется последовательность строк. С разными named pipes проблема скорее всего та же.


Ответы (1 шт):

Автор решения: eri

Сделай 2 fifo и направляй туда потоки. Отправляешь дальше задачки фильтра в фон и можно писать.

mkfifo /tmp/err.fifo
mkfifo /tmp/out.fifo


grep good /tmp/out.fifo &
grep GOOD /tmp/err.fifo &

(
echo "stdout good"
echo "stdout bad"
echo "STDERR GOOD" 1>&2
echo "STDERR BAD" 1>&2
) 2> /tmp/err.fifo 1> /tmp/out.fifo 

С пайпами

cat /tmp/out.fifo | grep good &
cat /tmp/err.fifo | grep GOOD &

Последовательность теряется в случае если один фильтр работает медленней другого. Но в случае когда читаем вывод программы, который медленнее самого медленного фильтра, должно работать нормально.

→ Ссылка