2

我有一个 Ruby 脚本,它生成一个进程并使用 expect 等待输入请求,提供该输入,然后在进程完成时生成一个新进程。

最初的问题是脚本没有等待第一个进程完成,而是执行了脚本中的下一行。

所以我将 Process.wait(pid) 添加到脚本中,但现在脚本挂起等待第二个PTY.spawnat的输入Process.wait(pid)

我正在使用 Ruby 1.9.2 运行脚本,因为我知道在 Ruby 1.8.7 中 存在一些问题。PTY.spawn

脚本如下所示:

#!/usr/bin/env ruby
require 'pty'
require 'expect'


  PTY.spawn(" apt-get install policycoreutils ") do |reader, writer, pid|
    puts reader.expect(/Do you want to continue/)
    writer.printf("Y\n")
    Process.wait(pid)
  end

  PTY.spawn(" apt-get install libmagick9-dev ") do |reader, writer, pid|
    puts reader.expect(/Do you want to continue/)
    writer.printf("Y\n")
    Process.wait(pid)
  end

有谁知道为什么脚本会挂在Process.wait(pid)第二个PTY.spawn

4

2 回答 2

7

为了帮助您调试,我稍微减少了代码,并产生了一个更温和的命令:

require 'pty'
require 'expect'

PTY.spawn("sleep 1;echo 1") do |reader, writer, pid|
  puts reader.expect(/1/)
  Process.wait(pid)
end

PTY.spawn("sleep 1;echo 2") do |reader, writer, pid|
  puts reader.expect(/2/)
  Process.wait(pid)
end

这输出:

ruby test.rb 
1
2

这对我来说意味着问题出在apt-get命令上。

于 2011-12-06T23:44:21.973 回答
3

实际上我找到了一个解决方案,它非常简单,但有点令人惊讶。第二个 apt-get 真正要求的是

 "Do you want to continue [Y/n]? "

我认为正在发生的事情是期望在该字符串的第一部分匹配并在字符串完全输出之前发送“Y”并且apt-get尚未准备好接收“Y”。一旦我将期望匹配更改为上面的字符串,如下面的代码所示,那么一切正常。

PTY.spawn(" apt-get install libmagick9-dev ") do |reader, writer, pid|
   puts reader.expect(/Do you want to continue \[Y\/n\]\? /)
   writer.printf("Y\n")
   Process.wait(pid)
 end
于 2011-12-07T00:00:21.820 回答