# Question about run external program in Ruby

**URL:** <https://www.ruby-forum.com/t/question-about-run-external-program-in-ruby/156909>\
**Category:** Ruby\
**Created:** [January 5, 2009, 7:09am UTC](https://www.ruby-forum.com/t/question-about-run-external-program-in-ruby/156909 "2009-01-05T07:09:21Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![youhaodeyi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/b9bd4f/32.png) [@youhaodeyi](https://www.ruby-forum.com/u/youhaodeyi)\
**Post date:** [January 5, 2009, 7:09am UTC](https://www.ruby-forum.com/t/question-about-run-external-program-in-ruby/156909/1 "2009-01-05T07:09:21Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![youhaodeyi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/b9bd4f/32.png) [@youhaodeyi](https://www.ruby-forum.com/u/youhaodeyi)\
**Post date:** [January 5, 2009, 8:01am UTC](https://www.ruby-forum.com/t/question-about-run-external-program-in-ruby/156909/2 "2009-01-05T08:01:21Z")

</div>

Check $?.exitstatus

On Mon, Jan 5, 2009 at 8:08 AM, Zhao Yi [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> ## thanks.
> 
> Posted via [http://www.ruby-forum.com/](http://www.ruby-forum.com/).

–  
Andrew T.  
[http://ramblingsonrails.com](http://ramblingsonrails.com)  
[http://www.linkedin.com/in/andrewtimberlake](http://www.linkedin.com/in/andrewtimberlake)

“I have never let my schooling interfere with my education” - Mark Twain

---

<div class="post-metadata">

**Author:** ![youhaodeyi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/b9bd4f/32.png) [@youhaodeyi](https://www.ruby-forum.com/u/youhaodeyi)\
**Post date:** [January 5, 2009, 8:06am UTC](https://www.ruby-forum.com/t/question-about-run-external-program-in-ruby/156909/3 "2009-01-05T08:06:20Z")

</div>

Andrew T. wrote:

> Check $?.exitstatus

I found that $?.exitstatus always return 0.

---

<div class="post-metadata">

**Author:** ![youhaodeyi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/b9bd4f/32.png) [@youhaodeyi](https://www.ruby-forum.com/u/youhaodeyi)\
**Post date:** [January 6, 2009, 9:26am UTC](https://www.ruby-forum.com/t/question-about-run-external-program-in-ruby/156909/4 "2009-01-06T09:26:00Z")

</div>

How can I get stderr in this method?

---

<div class="post-metadata">

**Author:** ![youhaodeyi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/b9bd4f/32.png) [@youhaodeyi](https://www.ruby-forum.com/u/youhaodeyi)\
**Post date:** [January 5, 2009, 8:22am UTC](https://www.ruby-forum.com/t/question-about-run-external-program-in-ruby/156909/5 "2009-01-05T08:22:59Z")

</div>

On Mon, Jan 5, 2009 at 8:08 AM, Zhao Yi [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> ## thanks.
> 
> Posted via [http://www.ruby-forum.com/](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://ramblingsonrails.com)  
[http://www.linkedin.com/in/andrewtimberlake](http://www.linkedin.com/in/andrewtimberlake)

“I have never let my schooling interfere with my education” - Mark Twain

---

<div class="post-metadata">

**Author:** ![youhaodeyi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/b9bd4f/32.png) [@youhaodeyi](https://www.ruby-forum.com/u/youhaodeyi)\
**Post date:** [January 7, 2009, 2:50pm UTC](https://www.ruby-forum.com/t/question-about-run-external-program-in-ruby/156909/6 "2009-01-07T14:50:01Z")

</div>

Another option is the open4 gem. See  
[http://www.codeforpeople.com/lib/ruby/open4/open4-0.9.6/README](http://www.codeforpeople.com/lib/ruby/open4/open4-0.9.6/README)  
and scroll down to SAMPLES

---

<div class="post-metadata">

**Author:** ![youhaodeyi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/b9bd4f/32.png) [@youhaodeyi](https://www.ruby-forum.com/u/youhaodeyi)\
**Post date:** [January 6, 2009, 9:53am UTC](https://www.ruby-forum.com/t/question-about-run-external-program-in-ruby/156909/7 "2009-01-06T09:53:03Z")

</div>

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)
