2015-04-07 95 views
2

我试图使用过程中替换的标准输出在while循环是这样的:BASH嵌套进程替换

#!/bin/bash 

FILE_1=f1.txt 
FILE_2=f2.txt 

while read LINE; do 
    echo "$LINE" 
done < <(paste <(tail -f "$FILE_1") <(tail -f "$FILE_2")) 

什么它应该做的是合并FILE_1和FILE_2的最后几行,每当新数据被添加到文件中。显然,我想做的不仅仅是在while循环中打印这行,但这是一个很好的例子。

不幸的是,当我运行这个脚本时,它只是坐在终端上,什么也不做。

运行只是这一行:

paste <(tail -f "$FILE_1") <(tail -f "$FILE_2") 

作品完美,我可以看到终端上的输出,因为我在数据添加到文件中。

是否需要使用某些特殊语法才能将stdout传输到另一个进程?

我试着做

paste <(tail -f "$FILE_1") <(tail -f "$FILE_2") | while read LINE; do... 

,但它仍然只是坐在终端。

+0

@Kashyap不,我要做的进程替换了重定向。我不确定什么<<(...)甚至。 – user3473949

+0

@Kashyap:我找不到任何有关使用<<运算符的信息。你能将我链接到联机帮助页的相关部分吗? – user3473949

+4

@ kashyap在这里混合了文档,但这里完全是一条红鲱鱼。删除此评论主题将是一个很好的前进方向。 – tripleee

回答

5

当标准输出不是终端时,paste将缓冲其输出。你的命令有效,它只是在发生任何事情之前需要一定量的输入。

立刻得到输出,你可以用stdbuf无缓冲标准输出:

stdbuf -oL paste <(tail -f "$FILE_1") <(tail -f "$FILE_2") | while read LINE; do... 
0

我相信你有两个主要问题。首先,您需要结合使用这里的字符串,命令替换,以及进程替换来完成您希望的重定向。例如:

while read LINE 
do 
    echo "$LINE" 
done <<< "$(paste <(tail -2 "$FILE_1") <(tail -2 "$FILE_1"))" 

上述命令正常工作。然而,note通过使用tail(例如tail -2)的封闭形式,上面的命令使用来自FILE_1FILE_2的可确定的一组行。我不认为你可以在这种情况下使用follow选项。我在寻找,但还没有找到为什么的规则。使用--serial选项进行粘贴没有任何区别。

+0

谢谢,我会考虑使用这些元素的组合。你能解释为什么我尝试的过程替换不起作用吗?只需将两个进程替换作为输入的paste命令可以正常工作,那么如何才能获得stdout流呢? – user3473949

+0

当然,它让我读书和抓我的头。祝你好运。 –