Issue #17994 has been updated by mame (Yusuke Endoh).


I noticed that this issue is not only in `IO.read` but also in `IO.binread`, `IO.write`, `IO.binwrite`, and `IO.readlines`.
Adding `File.binread` etc. is clearly hard to maintain, so I agree that we should change only the doc of `IO.read` etc.

I have no strong opinion about prohibiting Socket.read etc. `IO.read` is a tricky class method because it changes its behavior depending on its receiver class, so it makes sense if the receiver is neither IO or File, but I'd like to keep the behavior if anyone is against the change.

----------------------------------------
Feature #17994: Clarify `IO.read` behavior and add `File.read` method
https://bugs.ruby-lang.org/issues/17994#change-92922

* Author: mame (Yusuke Endoh)
* Status: Open
* Priority: Normal
----------------------------------------
`IO.read` creates a subprocess when a given file name starts with a `|` character.

```
irb(main):001:0> IO.read("| ls /etc/passwd")
=> "/etc/passwd\n"
```

To disable this feature, `File.read` can be used.

```
irb(main):002:0> File.read("| ls /etc/passwd")
(irb):2:in `read': No such file or directory @ rb_sysopen - | ls /etc/passwd (Errno::ENOENT)
```

So, as far as I know, `File.read` is more prefereable to `IO.read` if a user want to just read a file.

However, in terms of the implementation, there is no definition of `File.read`. `File.read` invokes `IO.read` because `IO` is a superclass of `File`, and `IO.read` creates a subprocess only when its receiver is exactly the `IO` class.

I think there are two problems in the current situation:

1. The rdoc of `IO.read` does not explain the behavior to disable a subprocess invocation.
2. The rdoc does not have an entry for `File.read`.

I've created a PR to address the two issues by clarifying `IO.read` behavior and defining `File.read` as an alias to `IO.read`.

https://github.com/ruby/ruby/pull/4579



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

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>