[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

How to separate stdout & stderr from executed shell command

John Woods

3/14/2008 6:41:00 PM

I would like to create a method which executes a given shell command
and returns an array containing three things: 1) stdout of the command
as a string, 2) stderr of the command as a string, and 3) the exit
status. I'm having trouble figuring out how to get stdout and stderr
as separate output.

Here's an illustration of the desired result I'm after:

irb> my_exec_command("ls existant_file")
=> ["existant_file\n", "", 0]

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?
6 Answers

John Woods

3/14/2008 6:44:00 PM

0

On Mar 14, 11:40 am, jqwo...@gmail.com wrote:
> I would like to create a method which executes a given shell command
> and returns an array containing three things: 1) stdout of the command
> as a string, 2) stderr of the command as a string, and 3) the exit
> status. I'm having trouble figuring out how to get stdout and stderr
> as separate output.
>
> Here's an illustration of the desired result I'm after:
>
> irb> my_exec_command("ls existant_file")
> => ["existant_file\n", "", 0]
>
> 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!

Rodrigo Bermejo

3/14/2008 7:17:00 PM

0

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 via http://www.ruby-....

John Woods

3/14/2008 7:45:00 PM

0

On Mar 14, 12:16 pm, Rodrigo Bermejo <rodrigo.berm...@ps.ge.com>
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-....

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?

James Gray

3/14/2008 7:59:00 PM

0

On Mar 14, 2008, at 2:49 PM, jqwoods@gmail.com wrote:

> On Mar 14, 12:16 pm, Rodrigo Bermejo <rodrigo.berm...@ps.ge.com>
> 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-....
>
> 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


John Woods

3/14/2008 8:52:00 PM

0

On Mar 14, 12:58 pm, James Gray <ja...@grayproductions.net> wrote:
> On Mar 14, 2008, at 2:49 PM, jqwo...@gmail.com wrote:
>
>
>
> > On Mar 14, 12:16 pm, Rodrigo Bermejo <rodrigo.berm...@ps.ge.com>
> > 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-....
>
> > 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!

Arlen Cuss

3/14/2008 10:16:00 PM

0

[Note: parts of this message were removed to make it a legal post.]

Hi,

require "open3"

stdin, stdout, stderr = Open3.popen3('nroff -man')

Try it!

Arlen