Допустим, у меня есть программа, которая выводит:
abcd
l33t
1234
который я буду моделировать с помощью printf 'abcd\nl33t\n1234\n'
. Я хотел бы дать этот вывод двум программам одновременно. Моя идея состояла бы в том, чтобы использовать замену процесса с tee
. Допустим, я хочу передать копию вывода grep
:
printf 'abcd\nl33t\n1234\n' | tee >(grep '[a-z]' >&2) | grep '[0-9]'
Я получаю следующее с Bash 4.1.2 (Linux, CentOS 6.5), и это нормально:
l33t
1234
abcd
l33t
Но если подстановка процесса не перенаправляется на stderr (т. е. без >&2
), вот так:
printf 'abcd\nl33t\n1234\n' | tee >(grep '[a-z]') | grep '[0-9]'
Затем я получаю:
l33t
1234
l33t
Это похоже на то, как stdout из подстановки процесса (первый grep) используется процессом после конвейера (второй grep). За исключением того, что второй grep уже читает данные сам по себе, поэтому я думаю, что он не должен принимать во внимание данные из первого grep. Если я не ошибаюсь (а я точно ошибаюсь).
Что мне не хватает?
... | tee >(grep '[a-z]') >(grep '[0-9]') > /dev/null | cat
. Требуетсяcat
. Без него оболочка может запросить до завершения обоихgrep
процессов. - person Socowi   schedule 13.04.2017