From: "Ara.T.Howard" Date: 2005-11-24T02:34:45+09:00 Subject: Re: getting stdout and stderr for system calls on windows On Thu, 24 Nov 2005, Damphyr wrote: > OK, I'm stuck with a pretty problem: > I need to drive a build process using make (dmake) from my scripts and I > want to capture stdout and stderr as well as the return value from dmake. > Normally I would do it using Daniel Berger's win32-popen3, but I have a > Windows Installer Ruby with VC++6.0 which nastily gives me a segfault > (properly documented in the README, but still a segfault :) ). Recompiling > Ruby is a no-no and changing VC compiler also a no-no. > > Now, does anyone have a quick solution for me? Is there anyway to call say: > > system 'echo blabla' > > and to redirect stdout and stderr used by system? (I guess not). > Any help is appreciated. > I am aware of > > IO.popen("dmake target 2>&1") {|f| > output = f.read > exitcode = Process.waitpid2(f.pid)[1] > } > and is currently my best choice, although I would like to split stderr and > stdout. > > Cheers, > V.- i was working on this at one point: harp:~ > cat a.rb class Redirector require "tempfile" attr_accessor "ruby" def initialize @ruby = "ruby" @script = tempfile @script.write <<-ruby stdout, stderr = ARGV.shift, ARGV.shift File::unlink out rescue nil File::unlink err rescue nil STDOUT.reopen(open(stdout,"w")) STDERR.reopen(open(stderr,"w")) system(ARGV.join(' ')) ruby @script.close end def run command, redirects = {} stdout = redirects.values_at("stdout", :stdout, "o", :o, 1).compact.first tout = nil unless stdout tout = tempfile stdout = tout.path end stderr = redirects.values_at("stderr", :stderr, "e", :e, 2).compact.first terr = nil unless stderr terr = tempfile stderr = terr.path end system "#{ @ruby } #{ @script.path } #{ stdout } #{ stderr } #{ command }" ret = IO::read(stdout), IO::read(stderr), $?.exitstatus tout.close! if tout terr.close! if terr ret end def tempfile Tempfile::new(Process::pid.to_s << rand.to_s) end end redirector = Redirector::new stdout, stderr, exitstatus = redirector.run "echo 42" p [stdout, stderr, exitstatus] redirector.run "echo 42", 1 => "out", 2 => "err" p [IO::read("out"), IO::read("err")] harp:~ > ruby a.rb ["42\n", "", 0] ["42\n", ""] regards. -a -- =============================================================================== | ara [dot] t [dot] howard [at] noaa [dot] gov | all happiness comes from the desire for others to be happy. all misery | comes from the desire for oneself to be happy. | -- bodhicaryavatara ===============================================================================