4
我需要从我的Perl脚本执行一个命令,这需要一段时间(1-2小时)。我希望能够看到命令的输出,以便我的脚本可以检查一切正常,但由于需要很长时间,我希望用户在运行时也能看到命令输出。Perl执行命令,捕获和显示输出
我已经试过:
backticks
- 当命令完成system
只能得到输出 - 当命令完成open
只能得到输出 - 近乎完美 - 但命令输出被缓冲,这意味着用户很长一段时间没有看到更新。互联网是充满了建议设置$| = 1
但显然这只会影响输入缓冲并不起作用- 管道到
tee
- 类似结果open
- “三通”似乎只打印后 - 重新定向输出和使用
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();
}
看看http://stackoverflow.com/a/214005/1331451 – simbabque
将autoflush设置为真值会禁用当前选择文件句柄的缓冲。这与你所要求的有什么不同? – TLP
TLP,正如我所说的那样,而且似乎没有奏效。经过研究,我发现autoflush只影响输入缓冲。 – Frederik