4

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

我试过的:

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

很想有一个建议!


编辑:我接受了 Barmars 的回答。我相信它有效,因为 Expect.pm 使用伪终端。只是对于其他在未来查看这个问题的人来说,这就是我实现它的方式:

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

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

1 回答 1

2

使用Expect.pm应该禁用命令中的输出缓冲。

于 2012-09-03T09:14:42.877 回答