是否已经有一个程序可以读取多个管道或文件描述符并写入标准输出(不分割行)。
类似cat
,但同时读取所有文件并保留行。
就像是:
until(all fds are EOF) {
select(multiple fds);
read a line from triggered fd;
write the line to the stdout;
}
需要避免编写 select/epoll 循环或在简单程序中使用多线程。例如“select loop for bash”。
更新:我也创建unix.SE 上有类似的问题。
答案1
部分解决方案可能是使用:
tail -fq file1 file2 file3 | grep -v ^$ | yourprogram
我将其称为部分解决方案,因为它会删除每次更改文件时添加的grep
空行。如果您的输入包含空行,则会将其删除。tail
答案2
创建了一个程序来执行此操作:fdlinecombine。它读取指定的文件描述符并逐行输出数据。
检查了一些极端情况,进行了一些测试。希望它对某些人也有用。
答案3
使用 xargs(1) 和 tail(1) 的替代方法:
创建数据源:
$>touch datafile.txt
$>mkfifo pipe1
$>mkfifo pipe2
使用 xargs 启动 tail 进程:
$>echo datafile.txt pipe1 pipe2 | xargs -n 1 -P 0 tail -f >> datasink.txt
将数据推送至来源:
$>echo dataset1 > pipe1
$>echo dataset2 > datafile.txt
$>echo dataset3 > pipe1
$>echo dataset4 > pipe2
显示接收器的数据:
$>cat datasink.txt
dataset1
dataset2
dataset3
dataset4