Wie kann ich die Ausgabe von externen Befehlen in Echtzeit in Perl lesen?

Ich habe ein paar Bash-Skripte, die ich ausführe, aber es kann einige Stunden dauern, bis sie fertig sind. In dieser Zeit geben sie Download-Geschwindigkeiten, ETAs und ähnliche Informationen aus. Ich muss diese Informationen in Perl erfassen, habe jedoch ein Problem. Ich kann die Ausgabe nicht zeilenweise lesen (es sei denn, mir fehlt etwas).

Irgendeine Hilfe, um das herauszufinden?

EDIT: Um dies etwas besser zu erklären, starte ich mehrere Bash-Skripte nebeneinander. Ich möchte gtk mit Perl verwenden, um praktische Fortschrittsbalken zu erstellen. Derzeit führe ich für jedes Bash-Skript, das ich ausführen möchte, zwei Threads aus, einen Master-Thread zum Aktualisieren der grafischen Informationen. Es sieht ungefähr so ​​aus (soweit ich kann):

  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.
  }

Antworten auf die Frage(7)

Ihre Antwort auf die Frage