[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

communicating w/ command-line program (OR ruby expect

Cam

9/24/2007 9:58:00 PM

Hello,

I'm trying to communicate w/ a command-line process w/ ruby. I
thought IO.popen would be the right tool for the job, but I need to be
able to read and write to the process, and I can't get it to work
(i've googled for examples, but everything I have seen is only doing
one-way communication). Anyway, it looks like what I need is
something like "Expect" for ruby. Does anyone know if such a tool
exists? (Or any other way in which I could read/write from a
command-line program).

Thanks!
Cam

3 Answers

yermej

9/24/2007 10:07:00 PM

0

On Sep 24, 4:57 pm, "Cameron Matheson" <cameron.mathe...@gmail.com>
wrote:
> Hello,
>
> I'm trying to communicate w/ a command-line process w/ ruby. I
> thought IO.popen would be the right tool for the job, but I need to be
> able to read and write to the process, and I can't get it to work
> (i've googled for examples, but everything I have seen is only doing
> one-way communication). Anyway, it looks like what I need is
> something like "Expect" for ruby. Does anyone know if such a tool
> exists? (Or any other way in which I could read/write from a
> command-line program).
>
> Thanks!
> Cam

If you're just calling a command line tool like grep or something
(reads standard input and then returns result to standard out),
IO.popen is what you need:

cmd_output = IO.popen "cmd -args some stuff", 'r+' do |pipe|
pipe.write the_input
pipe.close_write
pipe.read.chomp
end

if $? == 0
# success, do something
else
# cmd exited with an error, deal with it
end

If you need to interact with something (a la irb, ftp, telnet, etc.)
you'll need to find something else, I think.

Jeremy

Cam

9/24/2007 10:19:00 PM

0

Hi,

On 9/24/07, yermej@gmail.com <yermej@gmail.com> wrote:
> If you need to interact with something (a la irb, ftp, telnet, etc.)
> you'll need to find something else, I think.

This is what I'm looking for (something to interact w/ a program that
has an ftp-like interface).

Thanks,
Cam

James Gray

9/24/2007 10:30:00 PM

0

On Sep 24, 2007, at 5:18 PM, Cameron Matheson wrote:

> Hi,
>
> On 9/24/07, yermej@gmail.com <yermej@gmail.com> wrote:
>> If you need to interact with something (a la irb, ftp, telnet, etc.)
>> you'll need to find something else, I think.
>
> This is what I'm looking for (something to interact w/ a program that
> has an ftp-like interface).

For FTP use Net::FTP, of course. Otherwise, Ruby does ship with a
simple expect library:

$ cat /usr/local/lib/ruby/1.8/expect.rb
$expect_verbose = false

class IO
def expect(pat,timeout=9999999)
buf = ''
case pat
when String
e_pat = Regexp.new(Regexp.quote(pat))
when Regexp
e_pat = pat
end
while true
if IO.select([self],nil,nil,timeout).nil? then
result = nil
break
end
c = getc.chr
buf << c
if $expect_verbose
STDOUT.print c
STDOUT.flush
end
if mat=e_pat.match(buf) then
result = [buf,*mat.to_a[1..-1]]
break
end
end
if block_given? then
yield result
else
return result
end
nil
end
end

__END__

Hope that helps.

James Edward Gray II