Необходимо вывести действие команды system () и иметь индикатор прогресса - PullRequest
1 голос
/ 18 июня 2011

У меня есть хороший индикатор прогресса из Нужен индикатор прогресса для команды Perl system (), использующей 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);

Теперь мой я хочу войти в системуSTDOUT и STDERR вывода команд.Я не слишком знаком с выводом канала, поэтому я попытался добавить:

print $LOG $cmd

и

print $LOG Dumper(\$cmd)

до конца цикла while.Это не работает.Первый вывод

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

, второй

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

Кто-нибудь знает, как я могу получить вывод из переданного по каналу $ cmd?Пример для $ command = make command

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

 ...

Ответы [ 2 ]

4 голосов
/ 18 июня 2011

Попробуйте сделать это

 print $LOG $_;

или, может быть, просто

 print $LOG;

(поскольку $_ является значением по умолчанию, если ничего не указано)

Для объяснения: $cmd - это файл, из которого вы читаете; $_ - строка, прочитанная с него. Вы можете сделать это более понятным, написав:

 while ($line = <$cmd>) {
    print $LOG $line;
    ...
 }
2 голосов
/ 18 июня 2011

$cmd - это дескриптор ввода-вывода для вывода вашей команды, внутренний тип данных, который не имеет особого смысла для печати.Вы хотите использовать <$cmd> или readline($cmd) для получения выходных данных, что вы уже делаете в цикле while:

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++;


}
...