开发者

Using Expect with Perl and pipe to a file

I'm fairly new to Perl and have been searching the interwebs for documentation for what I'm trying to do. I'm not having any luck.

I have a program that outputs information to stdout with prompts throughout. I need to make a Perl script to pipe that information to a file.

I thought I could use Expect but there seems to be a problem with the pipe after the first prompt.

Here is the part of my code:

# Run program and compare the output to the BASE file
$cmd = "./program arg1 arg2 arg3 arg4 > $outfile";

my $exp = new Expect;
$exp->spawn($cmd);
BAIL_OUT("couldn't create expect object") if (! defined $exp);

$exp->expect(2);
$exp->send("\n");

For this case there is only a single prompt for the user to press "enter". This program is small and very fast - 2 seconds is plenty of time to reach the first prompt.

The output file only contains the first half of the information.

Does anyone have any suggestions on how I can grab the second half as well?

UPDATE: I've verified that this works with Expect by using a simple script:

spawn ./program arg1 arg2 arg3 arg4
expect "<Return>"
send "\r"
interact

Where "< Return >" is a verbose expression that the Perl script could look for.

Note: I've tried writing my Perl script to expect "< Return >"...it makes no difference.

i.e.

$exp->expect(2, '-re', "<Return>")

Any thoughts?

UPDATE2:

Hazaah! I've found a solution to my problem...completely by accident.

So, I had a mistype in some test code I made...

$exp->expect(2);
$exp->send("\r");
$exp->expect(2);

Note the trailing expect(2)...I accidentally left that in and it worked!

So, I'm trying to understand what is happening. Unix expect does not seem work this way! It appears 开发者_C百科Expect implemented in Perl "expects" anything...not just prompts?

So, I provided expect another 2 seconds to collect stdout and I am able to get everything.

If anyone can offer some more detailed information as to what is going on here I'd love to understand what is going on.


Try sending \r instead of \n - you're trying to emulate a carriage return, not a newline, and the tty settings might not be translating them.

ALSO:

A suggestion from the Expect docs FAQ section, which seems likely given your accidental solution:

My script fails from time to time without any obvious reason. It seems that I am sometimes loosing output from the spawned program.

You could be exiting too fast without giving the spawned program enough time to finish. Try adding $exp->soft_close() to terminate the program gracefully or do an expect() for 'eof'.

Alternatively, try adding a 'sleep 1' after you spawn() the program. It could be that pty creation on your system is just slow (but this is rather improbable if you are using the latest IO-Tty).

Standard unix/tcl expect doesn't exit in interactive mode, which could give your program enough time to finish running.


It's been a while since I've used Expect, but I'm pretty sure you need to provide something for Expect to match the prompt against:

$exp->expect( 2, 'Press enter' );

for example.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜