# A convoluted question about stdout

**URL:** <https://www.ruby-forum.com/t/a-convoluted-question-about-stdout/91284>\
**Category:** Ruby\
**Created:** [April 6, 2007, 8:29am UTC](https://www.ruby-forum.com/t/a-convoluted-question-about-stdout/91284 "2007-04-06T08:29:11Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![soroe](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f9ae1b/32.png) [@soroe](https://www.ruby-forum.com/u/soroe)\
**Post date:** [April 6, 2007, 8:29am UTC](https://www.ruby-forum.com/t/a-convoluted-question-about-stdout/91284/1 "2007-04-06T08:29:11Z")

</div>

Hey Guys,

I know I can do a $stdout.reopen and redirect it to a file. Is there a  
more direct way to get at the contents of stdout… say, redirect stdout  
to variable?

Sonny.

---

<div class="post-metadata">

**Author:** ![soroe](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f9ae1b/32.png) [@soroe](https://www.ruby-forum.com/u/soroe)\
**Post date:** [April 6, 2007, 9:00am UTC](https://www.ruby-forum.com/t/a-convoluted-question-about-stdout/91284/2 "2007-04-06T09:00:37Z")

</div>

On 4/6/07, Sonny C. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Hey Guys,
> 
> I know I can do a $stdout.reopen and redirect it to a file. Is there a  
> more direct way to get at the contents of stdout… say, redirect stdout  
> to variable?

#!/usr/bin/env ruby

old\_std\_out = $stdout  
$stdout = File.open(“/tmp/file”, “w+”)

puts “where does the output go?”  
bruce@carlpowerbook:~/tmp$ rm -f /tmp/file  
bruce@carlpowerbook:~/tmp$ ./r.rb  
bruce@carlpowerbook:~/tmp$ cat /tmp/file  
where does the output go?  
bruce@carlpowerbook:~/tmp$

or, with build in clean up…

bruce@carlpowerbook:~/tmp$ rm -f /tmp/file  
bruce@carlpowerbook:~/tmp$ cat r.rb  
#!/usr/bin/env ruby

def with\_stdout(file\_name)  
old\_stdout = $stdout  
$stdout = File.open(file\_name, “w+”)  
yield  
$stdout = old\_stdout  
end

with\_stdout “/tmp/file” do  
puts “where does the output go?”  
end

puts “and where is stdout now?”  
bruce@carlpowerbook:~/tmp$ ./r.rb  
and where is stdout now?  
bruce@carlpowerbook:~/tmp$ cat /tmp/file  
where does the output go?

---

<div class="post-metadata">

**Author:** ![soroe](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f9ae1b/32.png) [@soroe](https://www.ruby-forum.com/u/soroe)\
**Post date:** [April 6, 2007, 9:22am UTC](https://www.ruby-forum.com/t/a-convoluted-question-about-stdout/91284/3 "2007-04-06T09:22:41Z")

</div>

On Fri, Apr 06, 2007 at 03:29:12PM +0900, Sonny C. wrote:

> I know I can do a $stdout.reopen and redirect it to a file.

Note that STDOUT is tied to the underlying operating system’s concept of  
“standard output” - for Unix this is the open file on file descriptor 1.  
So  
if you _reopen_ $stdout (or STDOUT) you’ll change what fd 1 points at.  
Then,  
anything else which writes directly to fd 1 - e.g. C extensions, or  
external  
programs run using system() or exec() - will also write to this file.

Now, you can change the global variable $stdout to point to a different  
IO  
object. In that case, anything in Ruby which does “$stdout.puts” will  
write  
to that new object. But anything which writes directly to fd 1 will  
still be  
writing to whatever the OS has attached to fd 1.

Regards,

Brian.

---

<div class="post-metadata">

**Author:** ![soroe](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f9ae1b/32.png) [@soroe](https://www.ruby-forum.com/u/soroe)\
**Post date:** [April 6, 2007, 4:28pm UTC](https://www.ruby-forum.com/t/a-convoluted-question-about-stdout/91284/4 "2007-04-06T16:28:53Z")

</div>

On 4/6/07, Sonny C. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> 

Maybe something like this (a variation on Bruce’s post):

def capture\_stdout(&block)  
raise ArgumentError, “No block given” if !block\_given?  
old\_stdout = $stdout  
$stdout = sio = StringIO.new  
yield  
$stdout = old\_stdout  
sio.rewind  
sio.read  
end

txt = capture\_stdout do  
puts “dlroW olleH”  
end  
puts txt.reverse

Regards,  
Sean

---

<div class="post-metadata">

**Author:** ![soroe](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f9ae1b/32.png) [@soroe](https://www.ruby-forum.com/u/soroe)\
**Post date:** [April 6, 2007, 7:09pm UTC](https://www.ruby-forum.com/t/a-convoluted-question-about-stdout/91284/5 "2007-04-06T19:09:31Z")

</div>

Thanks Sean. This is exactly what I was looking for… for some reason  
I overlooked the StringIO class when I was perusing the Standard Library  
listing.

Sonny.

Sean O’halpin wrote:

> On 4/6/07, Sonny C. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:
> 
> > 
> 
> Maybe something like this (a variation on Bruce’s post):
> 
> def capture\_stdout(&block)  
> raise ArgumentError, “No block given” if !block\_given?  
> old\_stdout = $stdout  
> $stdout = sio = StringIO.new  
> yield  
> $stdout = old\_stdout  
> sio.rewind  
> sio.read  
> end
> 
> txt = capture\_stdout do  
> puts “dlroW olleH”  
> end  
> puts txt.reverse
> 
> Regards,  
> Sean

---

<div class="post-metadata">

**Author:** ![soroe](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/f9ae1b/32.png) [@soroe](https://www.ruby-forum.com/u/soroe)\
**Post date:** [April 6, 2007, 7:06pm UTC](https://www.ruby-forum.com/t/a-convoluted-question-about-stdout/91284/6 "2007-04-06T19:06:42Z")

</div>

Interesting, that’s good info. Thanks Brian.

Sonny.
