【发布时间】:2012-09-03 20:07:10
【问题描述】:
我需要从我的 Perl 脚本中执行一个命令,这需要一段时间(1-2 小时)。我希望能够看到命令的输出,以便我的脚本可以检查一切是否正常,但是由于需要很长时间,我希望用户在运行时也能看到命令输出。
我尝试过的:
-
backticks- 只有在命令完成后才能得到输出 -
system- 只有在命令完成后才能得到输出 -
open- 几乎完美 - 但命令输出被缓冲,这意味着用户很长时间看不到更新。互联网上到处都是设置$| = 1的建议,但显然这只会影响输入缓冲并且不起作用 - 管道到
tee- 与open类似的结果 - 'tee' 似乎稍后才打印 - 重定向输出并使用
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();
}
【问题讨论】:
-
将 autoflush 设置为真值会禁用当前
selected 文件句柄的缓冲。这与您的要求有何不同? -
TLP,正如我所说,我试过了,但似乎没有用。经过研究,我读到 autoflush 只会影响输入缓冲。
-
短语
it doesn't work及其所有变体如果不详细说明几乎是无用的。不,它是 output 缓冲。没有输入缓冲。 -
@TLP,如果可以的话,我会在该评论中添加多个。