2011-01-29 18 views
2

我正在创建一个脚本来包装jdb(java调试器)。我基本上想要包装这个过程并代理用户交互。所以,我希望它:如何在ruby中代理shell进程

  • 开始加多宝从我的脚本
  • 发送加多宝的输出到stdout
  • 暂停,等待输入时,加多宝确实
  • 当用户输入命令,把它传递给jdb

此刻我真的想要传递给jdb。其原因是使用特定参数初始化进程,并可能在将来添加更多命令。

更新: 这里有什么最后我用期待的工作壳:

PTY.spawn("jdb -attach 1234") do |read,write,pid| 
    write.sync = true 

    while (true) do 
    read.expect(/\r\r\n> /) do |s| 
     s = s[0].split(/\r\r\n/) 
     s.pop # get rid of prompt                        

     s.each { |line| puts line } 

     print '> ' 
     STDOUT.flush 

     write.print(STDIN.gets) 
    end 
    end 
end 

回答

0

Ruby标准库包含expect,它是专为这种类型的问题而设计的。有关更多信息,请参阅the documentation

+0

链接无效。 – defactodeity

+0

谢谢;我删除了示例链接。如果您发现任何具有示例用法的当前网站,请告诉我。 –

4

使用Open3.popen3()。例如:

Open3.popen3("jdb args") { |stdin, stdout, stderr| 
    # stdin = jdb's input stream 
    # stdout = jdb's output stream 
    # stderr = jdb's stderr stream 
    threads = [] 
    threads << Thread.new(stderr) do |terr| 
     while (line = terr.gets) 
      puts "stderr: #{line}" 
     end 
    end 
    threads << Thread.new(stdout) do |terr| 
     while (line = terr.gets) 
      puts "stdout: #{line}" 
     end 
    end 
    stdin.puts "blah" 
    threads.each{|t| t.join()} #in order to cleanup when you're done. 
} 

我给你提供了线程的例子,但是你当然希望能够响应jdb正在做的事情。以上仅仅是您打开流程并处理与之沟通的框架。