2006/5/18, Stuart Holden <Stuart.Holden / baring-asset.com>:
> Hi,
>
> I'm trying to create a script that that is flexible enough to accept
> input that is read from a file whose filename is passed as a command
> line argument, or from STDIN via a pipe.
> (This is on a WinXP platform rather than Unix)
>
> By way of a simple example, I want both of the following to produce the
> same results:
>
>         1:      myScript.rb *.txt
> 2:      cat *.txt | myScript.rb
>
> I have had some joy with the first approach...
>
>                 while line = ARGF.gets
>                         #-- Do the interesting stuff here... or just
> print the line.
>                         print line
>                 end
>
> However, I cannot get anything to work for the pipe approach. I thought
> that this would handle piped along STDIN
>
>                 while gets()
>                         line = $_
>                         print line
>                 end
>
> but it chucks the following error:
>
>                 U:\dev\WM&CAPS\capsfiles>cat testfile.caps | caps.rb
>                 c:/scripts/caps.rb:1:in `gets': Bad file descriptor
> (Errno::EBADF)
>                         from c:/scripts/caps.rb:1

Works for me:

17:02:50 [~]: ruby -e 'while l=gets; p l; end' x
"foo\n"
17:03:07 [~]: cat x | ruby -e 'while l=gets; p l; end'
"foo\n"
17:03:12 [~]: uname -a
CYGWIN_NT-5.2-WOW64 PDBXPWSRK38 1.5.19(0.150/4/2) 2006-01-20 13:28 i686 Cygwin
17:03:16 [~]: ruby -v
ruby 1.8.4 (2005-12-24) [i386-cygwin]

I guess, you use the windows installer. I prefer the cygwin version as
it has better unix like behavior.  Maybe that's an option for you too.

Kind regards

robert

-- 
Have a look: http://www.flickr.com/photos/fussel-foto/