2011-01-29 1 views
2

Я создаю скрипт для переноса jdb (java debugger). Я по сути хочу обернуть этот процесс и прокси взаимодействовать с пользователем. Поэтому я хочу, чтобы:Как прокси-процесс оболочки в ruby ​​

  • начала JDB из моего сценария
  • отправить вывод JDB на стандартный вывод
  • паузу и ждать ввода, когда JDB делает
  • , когда пользователь вводит команды, передать его jdb

На данный момент я действительно хочу пройти через jdb. Причина этого заключается в том, чтобы инициализировать процесс с определенными параметрами и потенциально добавить в будущем больше команд.

Update: Вот оболочка, что в конечном итоге работает для меня, используя ожидать:

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

Thanks; Я удалил образцы ссылок. Если вы найдете какие-либо текущие сайты с примером использования, пожалуйста, дайте мне знать. –

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. Вышеизложенное является просто скелетом о том, как вы открываете процесс и обрабатываете связь с ним.

Смежные вопросы