Uma maneira de fazer isso pode ser algo como:
AnalysisProg <<PREPROCESS /dev/stdin
$(
{ process1=$( pipe | line | 1 >&2 & echo $! )
process2=$( pipe | line | 2 >&2 & echo $! )
while ps -p $process1 $process2 >/dev/null; do
sleep 1
done
} 2>&1
)
#END
PREPROCESS
Dessa forma, você faz o background de ambos os pipelines, mas ainda espera que eles terminem a execução antes de combinar sua saída em stdin, que é avaliada em um documento aqui e entregue ao AnalysisProg. Se você puder usar wait
, isso é ainda melhor que o loop while ps
, mas dependendo do shell, wait
pode objetar se você instrui para esperar em um processo que não é filho do shell atual.
Observe também que o método acima irá agrupar a saída - para que ambos os processos sejam gravados de uma só vez. Se você quisesse separá-los ou anexar um ao outro, possivelmente você poderia fazer:
AnalysisProg 3<<PREPROCESS /dev/fd/3 /dev/stderr
$(
process1=$(... >&2 ...) 2>/dev/fd/3
...
} 3>/dev/fd/3 2>/dev/stderr
)
Eu já demonstrei esses conceitos antes. Provavelmente, as melhores demonstrações são aqui e aqui .