Criado um programa para fazer exatamente isso: fdlinecombine. Ele lê os descritores de arquivos especificados e gera os dados de forma linear.
Verificou alguns casos de canto, testou um pouco. Esperando que seja útil para alguém também.
Já existe um programa que lê vários canais ou descritores de arquivos e grava na saída padrão (não em linhas de divisão).
Como cat
, mas lendo todos os arquivos simultaneamente e preservando as linhas.
Algo como:
until(all fds are EOF) {
select(multiple fds);
read a line from triggered fd;
write the line to the stdout;
}
É necessário evitar a codificação de loops de seleção / epoll ou o uso de multithreading em programas simples. Como "select loop for bash".
Atualização: eu também created uma pergunta semelhante no unix.SE.
Uma solução parcial poderia ser usar:
tail -fq file1 file2 file3 | grep -v ^$ | yourprogram
Chamo isso de solução parcial porque o grep
remove a linha vazia que tail
adiciona toda vez que ele altera o arquivo. Se sua entrada contiver linhas vazias, elas serão removidas.
Uma alternativa usando xargs (1) e tail (1):
Crie as fontes de dados:
$>touch datafile.txt
$>mkfifo pipe1
$>mkfifo pipe2
Inicie os processos finais com xargs:
$>echo datafile.txt pipe1 pipe2 | xargs -n 1 -P 0 tail -f >> datasink.txt
Envie dados para as fontes:
$>echo dataset1 > pipe1
$>echo dataset2 > datafile.txt
$>echo dataset3 > pipe1
$>echo dataset4 > pipe2
Mostrar dados do coletor:
$>cat datasink.txt
dataset1
dataset2
dataset3
dataset4
Tags linux