【问题标题】:Need a progress indicator for a Perl system() command using T:R:G mod需要使用 T:R:G mod 的 Perl system() 命令的进度指示器
【发布时间】:2011-08-28 11:36:07
【问题描述】:

我想要一个接受 Perl 输出的进度指示器

   system('make')

对于从 make 命令输出到 STDOUT 的每一行,我想输出一个点作为进度指示器。不幸的是,我使用的是 Term::ReadLine::Gnu Perl mod。

如何在 make 命令运行时重定向 STDOUT 以捕获和计算行数?

【问题讨论】:

标签: perl libreadline progress-indicator


【解决方案1】:
#!/usr/bin/perl

my $command = "make";

open (my $cmd, "$command |");
while(<$cmd>){
  print ".";
}
print "\n";

【讨论】:

  • 我建议为此使用三参数openopen my $cmd, '-|', $command or die $!; 这样更安全、更高效。
  • 好建议,我只使用三参数版本的文件,为什么不使用管道呢?此外,在这种情况下,使用 print over die 可能有其优势。
  • 您需要自动刷新 STDOUT,否则它会在打印前等待一整行点。 use IO::Handle; STDOUT-&gt;autoflush(1)
  • 是的,添加 $outStatus=$?;在while循环内,然后在循环后添加一行 print "$command was SUCCESSFUL\n" if ($outStatus ~~ 0);
【解决方案2】:
make >& >(while read f; do echo -n .; done; echo)

显然这是一个shell解决方案,但是作为进度指示器的点是一个点。

您当然可以在其中插入一个 T 恤,以便在出现问题时将制作的副本保存到文件中。

由于某些无法解释的原因,您似乎不喜欢(既不赞成也不接受)shell 解决方案,这里是一个纯粹的 perl 解决方案:

if (open(X,"make|")) { local($|)=1; while(<X>) { print "."; } close(X); print "\n";}

【讨论】:

  • 我没有想过让 shell 来做繁重的工作……很有趣。
  • @bitbucket:在前面的 shell 答案中添加了纯 perl 选项。
  • 我必须睡一觉...我今天正在测试解决方案。
猜你喜欢
  • 2011-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-02
  • 2012-10-22
  • 1970-01-01
  • 2011-11-04
  • 2016-03-31
相关资源
最近更新 更多