# Gets bug?

**URL:** <https://www.ruby-forum.com/t/gets-bug/89426>\
**Category:** Ruby\
**Created:** [January 4, 2006, 6:12pm UTC](https://www.ruby-forum.com/t/gets-bug/89426 "2006-01-04T18:12:43Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![Shea\_M](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/ecccb3/32.png) [@Shea\_M](https://www.ruby-forum.com/u/Shea_M)\
**Post date:** [January 4, 2006, 6:12pm UTC](https://www.ruby-forum.com/t/gets-bug/89426/1 "2006-01-04T18:12:43Z")

</div>

if ARGV.size \> 0 puts "first arg is #{ARGV[0]}" end puts "enter text" ans = gets puts "you said #{ans}"

Run this code, as ./test.rb. Then run it with an command line arg, like  
“./test.rb -x”. And you will get an error like this:

“test.rb:3:in `gets’: No such file or directory - -x (Errno::ENOENT)”

The fix I have found, is to change gets to $stdin.gets. I saw some  
traffic on the mailing list archives regarding this, but no resolution.

Is this expected behaviour?  
ruby -v is: ruby 1.8.3 (2005-09-21) [sparc-solaris2.10]

Thanks,

~S

---

<div class="post-metadata">

**Author:** ![Shea\_M](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/ecccb3/32.png) [@Shea\_M](https://www.ruby-forum.com/u/Shea_M)\
**Post date:** [January 4, 2006, 6:14pm UTC](https://www.ruby-forum.com/t/gets-bug/89426/2 "2006-01-04T18:14:27Z")

</div>

On Jan 4, 2006, at 9:17 AM, Shea M. wrote:

> Run this code, as ./test.rb. Then run it with an command line arg,  
> like “./test.rb -x”. And you will get an error like this:
> 
> “test.rb:3:in `gets’: No such file or directory - -x  
> (Errno::ENOENT)”
> 
> The fix I have found, is to change gets to $stdin.gets. I saw some  
> traffic on the mailing list archives regarding this, but no  
> resolution.
> 
> Is this expected behaviour?

Yes it is. Kernel.gets() reads from files specified as command-line  
options or STDIN, if none were given. This makes it easy to write  
Unix-style filters.

You can always shift the option out of ARGV before calling gets()  
with something like:

if ARGV.first == “-x”  
ARGV.shift

# …

end

Hope that helps.

James Edward G. II

---

<div class="post-metadata">

**Author:** ![Shea\_M](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/ecccb3/32.png) [@Shea\_M](https://www.ruby-forum.com/u/Shea_M)\
**Post date:** [January 4, 2006, 6:14pm UTC](https://www.ruby-forum.com/t/gets-bug/89426/3 "2006-01-04T18:14:28Z")

</div>

Shea M. wrote:

> Run this code, as ./test.rb. Then run it with an command line arg, like  
> Thanks,
> 
> ~S

I’ve run into this problem before as well, somebody pointed me to the ri  
documentation on Kernel#gets, it says the following.

Returns the next line from the list of files in +ARGV+, or from standard  
input if no files are present on the command line. Returns +nil+ at end  
of file.

Hope this helps.

---

<div class="post-metadata">

**Author:** ![Shea\_M](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/ecccb3/32.png) [@Shea\_M](https://www.ruby-forum.com/u/Shea_M)\
**Post date:** [January 4, 2006, 6:17pm UTC](https://www.ruby-forum.com/t/gets-bug/89426/4 "2006-01-04T18:17:38Z")

</div>

James Edward G. II wrote:

> > 
> 
> ARGV.shift
> 
> # …
> 
> end

I’d prefer to use OptionParser.parse! for this - but otherwise totally  
agree.

```
robert
```
