我需要从我的 Perl 脚本中执行一个命令,这需要一段时间(1-2 小时)。我希望能够看到命令的输出,以便我的脚本可以检查一切是否正常,但由于需要很长时间,我希望用户在运行时也能看到命令输出。
我试过的:
backticks
- 只能在命令完成时获得输出system
- 只能在命令完成时获得输出open
- 几乎完美 - 但命令输出是缓冲的,这意味着用户很长时间看不到更新。互联网上充满了设置建议,$| = 1
但显然这只影响输入缓冲并且不起作用- 管道到
tee
- 与 - 'tee' 类似的结果open
似乎稍后打印 - 重定向输出并使用
Proc::Background
和File::Tail
- 几乎再次完美,但想不出一种优雅的方式来停止打印循环
很想有一个建议!
编辑:我接受了 Barmars 的回答。我相信它有效,因为 Expect.pm 使用伪终端。只是对于其他在未来查看这个问题的人来说,这就是我实现它的方式:
my $process = Expect->spawn($command, @params) or die "Cannot spawn $command: $!\n";
while ($process->expect(undef))
{
print $process->before();
}