Вы делаете это именно так, как показали:
somecommand | tee >(othercommand)
Вывод somecommand
будет записан на вход othercommand
и на стандартный вывод.
Проблема с подстановкой вашего процесса echo 'bar'
заключается в том, что он не заботится о входных данных, поступающих через tee
из echo 'foo'
, поэтому он просто выводит bar
как можно быстрее и завершается. Затем утилита tee
пытается выполнить запись в него, но терпит неудачу и, следовательно, прекращает (получение сигнала PIPE
)перед записью строки в стандартный вывод. Или у tee
может быть время для записи данных в процесс подстановки, и в этом случае и bar
, и foo
будут напечатаны на стандартном выводе, это не детерминировано.
Нужно убедиться, что команда в процессе подстановки действительно считывает отправленные ей данные (иначе какой смысл отправлять ей данные?)Как предлагает дядя Билли в комментариях , это легко организовать в вашем примере, позволив процессу подстановки просто использоватьcat >/dev/null
(при условии, что вас не интересуют данные, поступающие изtee
):
echo 'foo' | tee >(cat >/dev/null; echo 'bar')
или
echo 'foo' | tee >(echo 'bar'; cat >/dev/null)
(эти два варианта будут различаться только порядком окончательного вывода двух строк)