1

我有一个不错的进度指示器,来自Need a progress indicator for a Perl system() command using 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 命令的示例

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

 ...
4

2 回答 2

4

尝试制作

 print $LOG $_;

或者也许只是

 print $LOG;

(因为$_如果未指定,则为默认值)

解释一下:$cmd是您正在读取的文件;$_是从中读取的行。你可以写得更清楚:

 while ($line = <$cmd>) {
    print $LOG $line;
    ...
 }
于 2011-06-17T21:06:07.863 回答
2

$cmd是命令输出的 I/O 句柄,这是一种对打印没有多大意义的内部数据类型。您想使用<$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++;


}
于 2011-06-17T21:08:44.283 回答