假设我有一个输出的程序:
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
这就像来自进程替换的标准输出(第一个 grep)被管道(第二个 grep)之后的进程使用。除了第二个 grep 已经在自己阅读内容,所以我想它不应该考虑第一个 grep 中的内容。除非我弄错了(我肯定是这样)。
我错过了什么?