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 № 1Tente 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++;
}