From: jqwoods@... Date: 2008-03-15T05:54:56+09:00 Subject: Re: How to separate stdout & stderr from executed shell comm On Mar 14, 12:58 pm, James Gray wrote: > On Mar 14, 2008, at 2:49 PM, jqwo...@gmail.com wrote: > > > > > On Mar 14, 12:16 pm, Rodrigo Bermejo > > wrote: > >> unknown wrote: > >>> On Mar 14, 11:40 am, jqwo...@gmail.com wrote: > > >>>> irb> my_exec_command("ls NON_existant_file") > >>>> => ["", "ls: NON_existant_file: No such file or directory\n", 2] > > >>>> Any pointers on how to implement my_exec_command? > > >>> PS: Unless there's a simpler way, if someone could just point me > >>> to an > >>> API that provides stdout and stderr of sub-processes as IO > >>> objects, I > >>> could probably figure it out from there. Thanks! > > >> Take a look at the IO class. > >> The Pickaxe book has some good examples. > > >> -r. > >> -- > >> Posted viahttp://www.ruby-forum.com/. > > > The closest API I could find is IO::popen. But as the doc for > > IO::popen says "...the subprocess's standard input and output will be > > connected..." So far I haven't found any way to get stdout and stderr > > of a sub-process *separately*. > > > Any other pointers? > > Yes, Ruby comes with a standard library for this, called open3. Here > are the docs for the method you want: > > $ qri Open3#popen3 > ----------------------------------------------------------- Open3#popen3 > popen3(*cmd) {|| ...} > ------------------------------------------------------------------------ > Open stdin, stdout, and stderr streams and start external > executable. Non-block form: > > require 'open3' > > [stdin, stdout, stderr] = Open3.popen3(cmd) > > Block form: > > require 'open3' > > Open3.popen3(cmd) { |stdin, stdout, stderr| ... } > > The parameter cmd is passed directly to Kernel#exec. > > Hope that helps. > > James Edward Gray II Exactly what I was looking for. Thanks!