Project

General

Profile

Actions

Bug #9067

closed

IO.reopen broken in 1.9/2.0, worked in 1.8

Added by walles (Johan Walles) over 10 years ago. Updated over 10 years ago.

Status:
Rejected
Assignee:
-
Target version:
-
ruby -v:
ruby 2.0.0p247 (2013-06-27 revision 41674) [universal.x86_64-darwin13]
[ruby-core:58084]

Description

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 '

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


Files

reopen-fail.rb (306 Bytes) reopen-fail.rb Repro walles (Johan Walles), 10/31/2013 05:04 AM

Updated by akr (Akira Tanaka) over 10 years ago

2013/10/31 walles (Johan Walles) :

Bug #9067: IO.reopen broken in 1.9/2.0, worked in 1.8
https://bugs.ruby-lang.org/issues/9067

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

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

I recommend
$stdin.reopen(IO.new(1, "r+"))
or
$stdin.reopen("/dev/tty")
instead of
$stdin.reopen($stdout)

Tanaka Akira

Updated by nobu (Nobuyoshi Nakada) over 10 years ago

  • Status changed from Open to Rejected

Updated by walles (Johan Walles) over 10 years ago

Thanks for the quick turnaround!

$stdin.reopen(IO.new(1, "r+")) does what I want.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0