Отдельные конвейеры (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 шт):
Сделай 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 &
Последовательность теряется в случае если один фильтр работает медленней другого. Но в случае когда читаем вывод программы, который медленнее самого медленного фильтра, должно работать нормально.