2013-08-22 1 views
2

쉘 명령 실행 중에 출력을 표시 할 수있는 백틱 운영자 (``)와 비슷한 것을 찾고 있습니다. (Running a command from Ruby displaying and capturing the output)실행 중 출력을 표시 할 수있는 백틱 운영자와 동일한 의미입니다.

output = [] 
IO.popen("ruby -e '3.times{|i| p i; sleep 1}'").each do |line| 
    p line.chomp 
    output << line.chomp 
end 
p output 

이 솔루션은 $부터 내 요구에 맞지 않는 :

나는 다른 게시물에 대한 해결책을 보았다? 쉘 명령 실행 후 nil로 유지됩니다. 내가 찾고있는 솔루션도 $를 설정해야합니까? ($ ?. exitstatus의 값을 다른 방법으로 반환하는 것으로도 충분합니다.)

감사! 다음

답변

3

시도 :

output = [] 
IO.popen("ruby -e '3.times{|i| p i; sleep 1 }'") do |f| 
    f.each do |line| 
    p line.chomp 
    output << line.chomp 
    end 
end 
p $? 

인쇄

"0" 
"1" 
"2" 
#<Process::Status: pid 2501 exit 0> 

open3

require 'open3' 

output = [] 
Open3.popen2("ruby -e '3.times{|i| p i; sleep 1}'") do |stdin,stdout,wait_thr| 
    stdout.each do |line| 
    p line.chomp 
    output << line.chomp 
    end 
    p wait_thr.value 
end 
4

먼저 사용하여, 나는 Open3의 방법 중 하나를 사용하는 것이 좋습니다 것입니다.

저는 많은 시스템에서 STDOUT과 STDERR의 출력을 가져와야 할 제 시스템에 capture3을 사용합니다.

파이프 된 하위 프로세스가 필요하면 popen3 또는 다른 "파이프 라인"명령 중 하나를 시도하십시오.

다음은 STDERR 채널을 무시하는 popen2을 사용하는 방법을 보여주는 몇 가지 코드입니다. 당신은 또한 popen3 사용을 추적 할 경우

require 'open3' 

output = [] 

exit_status = Open3.popen2(ENV, "ruby -e '3.times{|i| p i; sleep 1}'") { |stdin, stdout, thr| 
    stdin.close 
    stdout.each_line do |o| 
    o.chomp! 
    output << o 
    puts %Q(Read from pipe: "#{ o }") 
    end 
    thr.value 
} 

puts "Output array: #{ output.join(', ') }" 
puts "Exit status: #{ exit_status }" 

를 출력 실행 :

Read from pipe: "0" 
Read from pipe: "1" 
Read from pipe: "2" 
Output array: 0, 1, 2 
Exit status: pid 43413 exit 0 

예제 코드가 그것을 할 방법을 보여줍니다.

each_line을 사용할 필요는 없지만 하위 프로세스가 STDOUT을 닫을 때까지 한 줄씩 읽는 방법을 보여줍니다.

capture3 블록을 허용하지 않습니다. 자식이 출력을 닫고 종료 할 때까지 기다린 다음 내용을 반환합니다. 차단 프로세스를 원할 때 좋습니다. popen2popen3에는 차단 및 비 차단 버전이 있지만 여기에는 차단되지 않는 버전 만 표시되어 하위 프로세스에서 제공되는 콘텐츠를 읽고 출력하는 방법을 보여줍니다.

+0

capture3 (및 두 개의 다른 배열)을 사용하여 위의 동일한 작업을 수행하는 코드를 넣을 수 있습니까? – miluz

+0

코드에 두 개의 다른 배열이 없으며 하나만 있습니다. –