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
···
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.-
--
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
===============================================================================