Команда tee
отлично подходит, когда вы хотите сохранить поток в файл и продолжить его обработку. Однако, если вы хотите отправить stdout двум отдельным программам, вы можете использовать цикл чтения while и отобразить вывод в stdout и stderr, а затем передать stdout в одну программу и stderr в другую.
echo input |
while read foo; do
echo "$foo"
echo "$foo" >&2
done 2> >( command1 1>&2 ) | command2
Вот демонстрационная программа, в которой перед строкой «input» ставится число, показывающее, куда направляются выходные данные, а затем отправляется в качестве ввода две perl-программы, просто добавляющие имя потока.
echo input |
while read foo; do
echo "1: $foo"
echo "2: $foo" >&2
done 2> >( perl -wpe 's//STDERR: /;' 1>&2) | perl -wpe 's//STDOUT: /;'
вывод
STDERR: 2: input
STDOUT: 1: input
Предупреждение - функция while / read / echo может не сохранять окончания строк и двоичный текст, а длинные строки могут вызвать проблемы. Как и во многих других случаях, bash может быть не лучшим решением. Вот Perl-решение для чего угодно, кроме огромных файлов:
echo input |
perl -wne 'print STDERR; print;' 2> >( command1 >&2) | command2