2012-09-03 62 views
4

我需要从我的Perl脚本执行一个命令,这需要一段时间(1-2小时)。我希望能够看到命令的输出,以便我的脚本可以检查一切正常,但由于需要很长时间,我希望用户在运行时也能看到命令输出。Perl执行命令,捕获和显示输出

我已经试过:

  • backticks - 当命令完成
  • system只能得到输出 - 当命令完成
  • open只能得到输出 - 近乎完美 - 但命令输出被缓冲,这意味着用户很长一段时间没有看到更新。互联网是充满了建议设置$| = 1但显然这只会影响输入缓冲并不起作用
  • 管道到tee - 类似结果open - “三通”似乎只打印后
  • 重新定向输出和使用Proc::BackgroundFile::Tail - 几乎完美再次,但想不到一个优雅的方式来停止打印循环

很想有一个建议!


编辑:我已经接受巴马尔的回答。我相信这是有效的,因为Expect.pm使用伪终端。只是给别人看在未来这个问题,这是怎么了,我实现它:

my $process = Expect->spawn($command, @params) or die "Cannot spawn $command: $!\n"; 

while ($process->expect(undef)) 
{ 
    print $process->before(); 
} 
+2

看看http://stackoverflow.com/a/214005/1331451 – simbabque

+0

将autoflush设置为真值会禁用当前选择文件句柄的缓冲。这与你所要求的有什么不同? – TLP

+0

TLP,正如我所说的那样,而且似乎没有奏效。经过研究,我发现autoflush只影响输入缓冲。 – Frederik

回答

2

使用Expect.pm应在命令禁用输出缓冲。

+0

似乎精美的工作,并有一个优雅的实施。谢谢! – Frederik