/ / Necessidade de emitir a ação de um comando system () e ter um indicador de progresso - perl, pipe, indicador de progresso

Precisa enviar a ação de um comando system () e ter um indicador de progresso - perl, pipe, progress-indicator

Eu tenho um bom indicador de progresso de Precisa de um indicador de progresso para um comando Perl system () usando o T: R: G mod

open(my $cmd, "-|", "$command $flags_args 2>/dev/null")
or print "nAttention: Command $command $flags_args failed $!"
and return 1;

while (<$cmd>)
{
$percentage = ($cntr/$lines) * 100;
$percentage = 100 if $percentage > 100;

printf("Progress: %3d%%r", $percentage);
$cntr++;

}
close($cmd);

Agora meu eu quero log do STDOUT e STDERR dos comandos de saída. Como não estou familiarizado com a saída do tubo, tentei adicionar:

print $LOG $cmd

e

print $LOG Dumper($cmd)

antes do final do loop while. Não funcionou. A primeira saída

GLOB(0x11df7a0)GLOB(0x11df7a0)GLOB(0x11df7a0)

o segundo

$VAR1 = \*{"::$cmd"};
$VAR1 = \*{"::$cmd"};
$VAR1 = \*{"::$cmd"};

Alguém sabe como posso obter a saída do $ cmd canalizado? Exemplo para um comando $ command = make

 Making all in src
make[1]: Entering directory `/tmp"
Making all in include
make[2]: Entering directory "/tmp/2"

...

Respostas:

4 para resposta № 1

Tente fazer

 print $LOG $_;

ou talvez apenas

 print $LOG;

(Desde a $_ é o padrão se nada for especificado)

Explicar: $cmd é o arquivo do qual você está lendo; $_ é a linha lida dele. Você pode deixar isso mais claro escrevendo:

 while ($line = <$cmd>) {
print $LOG $line;
...
}

2 para resposta № 2

$cmd é o identificador de E / S para a saída do seu comando, um tipo de dados interno que não faz muito sentido para imprimir. Você quer usar <$cmd> ou readline($cmd) para obter a saída dele, o que você já faz em seu while loop:

while (<$cmd>)      # same as:    while (defined($_ = readline($cmd)))
{
# last line from command is now stored in $_
print $LOG $_;

$percentage = ($cntr/$lines) * 100;
$percentage = 100 if $percentage > 100;

printf("Progress: %3d%%r", $percentage);
$cntr++;


}