2014-04-20 2 views

답변

1

을 수행해야합니다 당신은 IO.select 또는 다른 IO 스케줄러, 또는 필요할 수 있습니다

  • 기다립니다 popen3 -- o
  • 에서 명령의 출력 STDIN에서 사용자 입력에 대한

    1. 기다립니다 일부 다른 다중 작업 스케줄러 (예 : Thread).

      require 'open3' 
      
      Open3.popen3('ruby -e "while line = gets; print line; end"') do |i, o, t| 
          tin = Thread.new do 
          # here you can manipulate the standard input of the child process 
          i.puts "Hello" 
          i.puts "World" 
          i.close 
          end 
      
          tout = Thread.new do 
          # here you can fetch and process the standard output of the child process 
          while line = o.gets 
           print "COMMAND => #{line}" 
          end 
          end 
      
          tin.join # wait for the input thread 
          tout.join # wait for the output thread 
      end 
      
    +0

    은 내가 루비 스레드 동기화 경험이 없기 때문에 코드를 사용하기를 꺼려 해요 : 여기

    Thread 방법에 대한 데모입니다. 기본적으로, 나는 출력을 프로그램 적으로 처리하고, 쉘을 사용하는 동안 쉘과 상호 작용할 수 있기를 원한다. 그렇게 할 수있는 더 간단한 방법이 있습니까? 쉘을 실행하고 'tee'출력을 내 프로그램으로 리디렉션하면 어떻게 될까요? 내 문제를 해결할 수 있을까요? –

    +0

    @ArtShayderov 데모를 약간 업데이트하고 몇 가지 의견을 추가했습니다. Ruby 파일에 저장하고 테스트 할 수 있습니다. 표준 입력을 조작 할 위치와 표준 출력을 처리 할 위치를 분명히해야합니다. –

    +0

    그래서 나는 STDIN을 주석 블록 안에'STDIN.each_char {| c | i.puts c}'? –

    관련 문제