Issue #9067 has been updated by walles (Johan Walles).


Thanks for the quick turnaround!

$stdin.reopen(IO.new(1, "r+")) does what I want.
----------------------------------------
Bug #9067: IO.reopen broken in 1.9/2.0, worked in 1.8
https://bugs.ruby-lang.org/issues/9067#change-42709

Author: walles (Johan Walles)
Status: Rejected
Priority: Normal
Assignee: 
Category: 
Target version: 
ruby -v: ruby 2.0.0p247 (2013-06-27 revision 41674) [universal.x86_64-darwin13]
Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN


Try piping some input into the attached code:

echo foo | reopen-fail.rb

Works as expected with ruby 1.8.7 (2012-02-08 patchlevel 358) [i686-linux]:
* "foo" is printed at the middle of the screen
* you can press RETURN to exit

Results with ruby 1.9.3p194 (2012-04-20 revision 35410) [i686-linux] and ruby 2.0.0p247 (2013-06-27 revision 41674) [universal.x86_64-darwin13]:

 ./reopen-fail.rb:8:in `reopen': <STDIN> can't change access mode from "r" to "w" (ArgumentError)
 	from ./reopen-fail.rb:8:in `<main>'

AFAICT this makes it impossible to write Curses programs in Ruby that can accept input through pipes with newer versions of Ruby.

In my particular case this blocks my Ruby-implemented less replacement: https://github.com/walles/moar


-- 
http://bugs.ruby-lang.org/