먼저 사용하여, 나는 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
블록을 허용하지 않습니다. 자식이 출력을 닫고 종료 할 때까지 기다린 다음 내용을 반환합니다. 차단 프로세스를 원할 때 좋습니다. popen2
및 popen3
에는 차단 및 비 차단 버전이 있지만 여기에는 차단되지 않는 버전 만 표시되어 하위 프로세스에서 제공되는 콘텐츠를 읽고 출력하는 방법을 보여줍니다.
capture3 (및 두 개의 다른 배열)을 사용하여 위의 동일한 작업을 수행하는 코드를 넣을 수 있습니까? – miluz
코드에 두 개의 다른 배열이 없으며 하나만 있습니다. –