BASH 嵌套过程替换

BASH Nested Process Substitution

我正在尝试在 while 循环中使用进程替换的标准输出,如下所示:

#!/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")

工作完美,当我向文件中添加数据时,我可以在终端上看到输出。

是否需要使用一些特殊语法才能将标准输出通过管道传输到另一个进程?

我试过

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

但它仍然只是在航站楼。

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

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

上面的命令工作正常。但是,请注意,上面的命令通过使用 tail 的封闭形式(例如 tail -2).我不认为你可以在这种情况下使用 follow 选项。我正在寻找,但还没有找到规则原因。使用 --serial 选项粘贴没有区别。

当 stdout 不是终端时,paste 将缓冲其输出。您的命令有效,它只需要一定数量的输入才能发生任何事情。

要立即获得输出,您可以使用 stdbuf:

取消缓冲标准输出
stdbuf -oL paste <(tail -f "$FILE_1") <(tail -f "$FILE_2") | while read LINE; do...