2011-01-29 5 views
2

jdb(Javaデバッガ)をラップするスクリプトを作成しています。私は本質的にこのプロセスを包み込み、ユーザーのやり取りを代理したいと思っています。だから私はそれにしたい:私のスクリプト ルビーでシェルプロセスをプロキシする方法

  • から

    • 開始JDBを
    • 一時停止を標準出力に出力し、ユーザがコマンドを入力したときにJDBが
    • を行う際に入力を待つ、それを渡すためにJDBの出力を送信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がやっていることに反応したいと思っています。上記は単にプロセスを開いてプロセスとの通信を処理するためのスケルトンに過ぎません。

    関連する問題