Como posso ler a saída de comandos externos em tempo real em Perl?
Eu tenho alguns scripts bash que eu corro, mas eles podem levar várias horas para terminar, período durante o qual eles expelem velocidades de download, ETAs e informações semelhantes. Eu preciso capturar esta informação em perl, mas estou correndo em um problema, não consigo ler a linha de saída por linha (a menos que eu esteja faltando alguma coisa).
Alguma ajuda para resolver isso?
EDIT: para explicar isso um pouco melhor eu estou executando vários scripts bash ao lado uns dos outros, gostaria de usar o gtk com perl para produzir barras de progresso à mão. Atualmente, estou executando 2 threads para cada script bash que desejo executar, um thread mestre para atualizar as informações gráficas. Parece algo assim (reduza o máximo que eu puder):
my $command1 = threads->create(\&runCmd, './bash1', \@out1);
my $controll1 = threads->create(\&monitor, $command1, \@out1);
my $command1 = threads->create(\&runCmd, 'bash2', \@out2);
my $controll2 = threads->create(\&monitor, $command2, \@out2);
sub runCmd{
my $cmd = shift;
my @bso = shift;
@bso = `$cmd`
}
sub monitor{
my $thrd = shift;
my @bso = shift;
my $line;
while($thrd->is_running()){
while($line = shift(@bso)){
## I check the line and do things with it here
}
## update anything the script doesn't tell me here.
sleep 1;# don't cripple the system polling data.
}
## thread quit, so we remove the status bar and check if another script is in the queue, I'm omitting this here.
}