我对我的bash命令的行为有疑问。我想从stdout到2个不同的文件两次相同的通量。为此,我做了:
./prog | tee >(grep -i 'grep1' > file1) | grep -i 'grep2' > file2
但我的file2是空的。我认为我的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
重定向捕获,为什么我必须添加另一个命名管道呢?
答案 0 :(得分:2)
./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
答案 1 :(得分:0)
在阅读肯特的答案并使用seq
使用他的例子后,我发现问题是我的程序。
我的程序表现为一个守护程序,因此最后一次重定向的最后一个管道没有作为第一个分叉,所以在程序结束之前没有做任何事情。
所以我已经有了正确的解决方案,使用2个命名管道进行2次重定向:
./prog | tee >(grep -i 'grep1' > file1) >(grep -i 'grep2' > file2)