Bash 关于命名管道、grep和文件重定向的重定向行为

Bash 关于命名管道、grep和文件重定向的重定向行为,bash,grep,io-redirection,tee,Bash,Grep,Io Redirection,Tee,我对bash命令的行为有疑问。我想把相同的流量从标准输出到两个不同的文件。为此,我做了: ./prog | tee >(grep -i 'grep1' > file1) | grep -i 'grep2' > file2 但是我的文件2是空的。我想我的grep-I'grep2'没有捕获任何内容,但如果我只是键入: ./prog | tee >(grep -i 'grep1' > file1) | grep -i 'grep2' 我确实有我的出席结果: [grep

我对bash命令的行为有疑问。我想把相同的流量从标准输出到两个不同的文件。为此,我做了:

./prog | tee >(grep -i 'grep1' > file1) | grep -i 'grep2' > file2
但是我的文件2是空的。我想我的
grep-I'grep2'
没有捕获任何内容,但如果我只是键入:

./prog | tee >(grep -i 'grep1' > file1) | grep -i 'grep2'
我确实有我的出席结果:

[grep2] mylog...
[grep2] mylog...
[grep2] mylog...
我使用此命令成功写入两个文件:

./prog | tee >(grep -i 'grep1' > file1) >(grep -i 'grep2' > file2)
但是我必须在最后添加
/dev/null
,以使stdout中没有任何输出


我的问题是,为什么第二次grep之后的重定向没有被我的
file2
重定向捕获,为什么我必须添加另一个命名管道来执行此操作?

您就快到了。试试这个:

./prog | tee >(grep -i 'grep1' > file1) >(grep -i 'grep2' > file2)
如果要跳过标准输出,请执行以下操作

./prog | tee >(grep -i 'grep1' > file1) >(grep -i 'grep2' > file2) > /dev/null
例如:

kent$  seq 30|tee >(grep 2 >a) >(grep 3 > b) > /dev/null                                                                                                                    

kent$  head a b
==> a <==
2
12
20
21
22
23
24
25
26
27

==> b <==
3
13
23
30
kent$seq 30 | tee>(grep 2>a)>(grep 3>b)>/dev/null
肯特$head a b

==>ab在阅读了Kent的答案并使用他的例子
seq
之后,我发现问题出在我的程序上。 我的程序的行为就像一个执事,所以最后一个重定向的最后一个管道没有像第一个管道那样分叉,所以在程序结束之前什么都没有做

因此,我已经有了正确的解决方案,使用2个命名管道进行2个重定向:

./prog | tee >(grep -i 'grep1' > file1) >(grep -i 'grep2' > file2)

+1、
tee
的良好使用,这是正确的工具!我已经找到了这个解决方案,但是有没有办法避免使用第二个命名管道和/dev/null重定向?@Turgal我刚刚测试了
seq 30 | tee>(grep 2>a)| grep 3>b
它在bash下工作了$有趣的是,它也适用于
seq
命令,但不适用于我的程序。。。即使我的第二个grep与第一个grep相同,它也会创建一个空文件(直接重定向到我的file1)