Forum: Ruby Question about run external program in Ruby

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Zhao Y. (Guest)
on 2009-01-05 08:09
I use this method to run a external program in ruby:

io=IO.popen("lsa 2>&1")do |f|
   while line =f.gets do
       puts line
   end
end

I can get both stdout and stderr output but how can I get the command
return value?

thanks.
Andrew T. (Guest)
on 2009-01-05 09:01
(Received via mailing list)
Check $?.exitstatus

On Mon, Jan 5, 2009 at 8:08 AM, Zhao Yi <removed_email_address@domain.invalid> 
wrote:

>
> thanks.
> --
> Posted via http://www.ruby-forum.com/.
>
>


--
Andrew T.
http://ramblingsonrails.com
http://www.linkedin.com/in/andrewtimberlake

"I have never let my schooling interfere with my education" - Mark Twain
Zhao Y. (Guest)
on 2009-01-05 09:06
Andrew T. wrote:
> Check $?.exitstatus
>

I found that $?.exitstatus always return 0.
Andrew T. (Guest)
on 2009-01-05 09:22
(Received via mailing list)
On Mon, Jan 5, 2009 at 8:08 AM, Zhao Yi <removed_email_address@domain.invalid> 
wrote:

>
> thanks.
> --
> Posted via http://www.ruby-forum.com/.
>
>
Try the following:
io=IO.popen("ruby some_file_that_doesnt_exist")do |f|
  while line =f.gets do
      puts line
  end
end
puts $?.exitstatus
#returns - 1

--
Andrew T.
http://ramblingsonrails.com
http://www.linkedin.com/in/andrewtimberlake

"I have never let my schooling interfere with my education" - Mark Twain
Zhao Y. (Guest)
on 2009-01-06 10:26
How can I get stderr in this method?
Brian C. (Guest)
on 2009-01-06 10:53
Zhao Yi wrote:
> How can I get stderr in this method?

You are already combining stderr with stdout (2>&1)

To get them separately, see open3.rb in the standard library.

# Open3 grants you access to stdin, stdout, and stderr when running
another
# program. Example:
#
#   require "open3"
#   include Open3
#
#   stdin, stdout, stderr = popen3('nroff -man')
#
# Open3.popen3 can also take a block which will receive stdin, stdout
and
# stderr as parameters.  This ensures stdin, stdout and stderr are
closed
# once the block exits. Example:
#
#   require "open3"
#
#   Open3.popen3('nroff -man') { |stdin, stdout, stderr| ... }

However, since it forks twice, I believe you lose the exit status from
the (grand)child. You also need to be careful not to block on reading
from stdout when the child has written a large amount of data to stderr,
or vice versa. (For example, you could use select, or you could have two
separate threads reading from stdout and stderr)
Brian C. (Guest)
on 2009-01-07 15:50
Another option is the open4 gem. See
http://www.codeforpeople.com/lib/ruby/open4/open4-...
and scroll down to SAMPLES
This topic is locked and can not be replied to.