作者:手浪用户2602933263 | 来源:互联网 | 2023-02-06 17:28
假设我有一个程序输出:
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中的东西.除非我弄错了(我肯定是).
我错过了什么?