【问题标题】:Perl execute command, capture and display outputPerl 执行命令,捕获并显示输出
【发布时间】:2012-09-03 20:07:10
【问题描述】:

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

我尝试过的:

  • backticks - 只有在命令完成后才能得到输出
  • system - 只有在命令完成后才能得到输出
  • open - 几乎完美 - 但命令输出被缓冲,这意味着用户很长时间看不到更新。互联网上到处都是设置 $| = 1 的建议,但显然这只会影响输入缓冲并且不起作用
  • 管道到tee - 与open 类似的结果 - 'tee' 似乎稍后才打印
  • 重定向输出并使用 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();
}

【问题讨论】:

  • 将 autoflush 设置为真值会禁用当前 selected 文件句柄的缓冲。这与您的要求有何不同?
  • TLP,正如我所说,我试过了,但似乎没有用。经过研究,我读到 autoflush 只会影响输入缓冲。
  • 短语it doesn't work 及其所有变体如果不详细说明几乎是无用的。不,它是 output 缓冲。没有输入缓冲。
  • @TLP,如果可以的话,我会在该评论中添加多个。

标签: perl background-process


【解决方案1】:

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

【讨论】:

  • 似乎工作得很好,并且有一个优雅的实现。谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-10-01
  • 1970-01-01
  • 2021-05-20
  • 1970-01-01
  • 2017-07-05
  • 2018-01-28
  • 1970-01-01
  • 2019-11-29
相关资源
最近更新 更多