Forum: Ruby Command Line Processing / Pipes

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
89bb4a34f0294dfcea27af4ed6c98b07?d=identicon&s=25 Stuart Holden (Guest)
on 2006-05-18 14:18
(Received via mailing list)
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

It does work for STDIO that comes in from the console, but not the pipe.
Oddly (for me), this code works when you pass the filename on the
command line.
Apologies for my newbie stupidity. I've had a good half hours google for
help on this but haven't had any luck.

Any help would be appreciated.

Thanks,
Stuart Holden

Senior Analyst Developer / IT Technical Services - Baring Asset
Management (London)
Tel Direct: +44 (0)20-7214 1932   Fax Direct: +44 (0)20-7214 1634
E-mail: Stuart.Holden@Baring-Asset.com   Web:
http://www.baring-asset.com <http://www.baring-asset.com/>



<body>

<blockquote>
<font FACE="Arial,Arial" SIZE="1"><p ALIGN="JUSTIFY">This Email may
contain confidential and privileged information and is intended for the
use of the addressee(s) only.   If you are not the intended recipient
please notify the sender and delete the Email from your system. It
should not be transmitted to any other person without the consent of the
sender. Additional important notifications regarding Email transmissions
from and to members of Baring Asset Management can be accessed at <a
href="http://www.barings.com/email/index.hcst">http://ww...
</p>
</font>
</blockquote>

<p>&nbsp;</p>
</body>
</html>
23172b6630dc631a134c9bad2fec2a39?d=identicon&s=25 Chris (Guest)
on 2006-05-18 15:23
The following works on Win2k with ruby 1.8.2 (2004-12-25) [i386-mswin32]

type save_sql_env.txt | ruby -n -e "print"

I use 'type' as 'cat' is not a windows command in Win2k
E0d864d9677f3c1482a20152b7cac0e2?d=identicon&s=25 Robert Klemme (Guest)
on 2006-05-18 17:10
(Received via mailing list)
2006/5/18, Stuart Holden <Stuart.Holden@baring-asset.com>:
>         1:      myScript.rb *.txt
> However, I cannot get anything to work for the pipe approach. I thought
>                 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
This topic is locked and can not be replied to.