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