使用Expect with Perl和pipe到文件

时间:2011-07-01 16:50:18

标签: perl expect

我对Perl很新,并且一直在搜索interwebs以获取我正在尝试做的文档。我没有运气。

我有一个程序,通过提示输出信息到stdout。我需要制作一个Perl脚本来将该信息传递给文件。

我以为我可以使用Expect但是在第一次提示后管道似乎有问题。

以下是我的代码部分:

# 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");

对于这种情况,用户只有一个提示按“输入”。这个程序很小而且非常快 - 2秒就有足够的时间来达到第一个提示。

输出文件仅包含信息的前半部分。

有没有人对如何抓住下半场有任何建议?

更新: 我已经通过使用简单的脚本验证了这与Expect一起使用:

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

“&lt; Return&gt;”是Perl脚本可以查找的详细表达式。

注意:我已经尝试编写我的Perl脚本以期待“&lt; Return&gt;”......它没有任何区别。

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

有什么想法吗?

UPDATE2:

Hazaah!我找到了解决问题的方法......完全是偶然的。

所以,我在一些测试代码中输错了...

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

请注意结尾预期(2)......我不小心把它留在了它并且它有效!

所以,我正在努力了解正在发生的事情。 Unix期望看起来不像这样!在Perl中实现Expect“期望”任何事情......不仅仅是提示吗?

所以,我提供了另外2秒钟收集标准输出,我能够得到一切。

如果有人能提供更详细的信息,我想知道发生了什么。

2 个答案:

答案 0 :(得分:4)

尝试发送\r而不是\n - 您试图模拟回车符,而不是换行符,并且tty设置可能不会翻译它们。

另外:

Expect docs FAQ部分的建议,似乎可能是您的意外解决方案:

  

我的脚本不时失败,没有任何明显的原因。它   似乎我有时会从产生的程序中丢失输出。

     

如果不给出衍生程序,你可能会退出太快   足够的时间来完成。尝试添加$ exp-&gt; soft_close()来终止   优雅地编程或为'eof'做一个expect()。

     

或者,尝试在生成()程序后添加“sleep 1”。   可能是你的系统上的pty创建速度很慢(但这是   如果您使用的是最新的IO-Tty,那就太不可能了。

标准的unix / tcl expect不会以交互模式退出,这可能会让你的程序有足够的时间来完成运行。

答案 1 :(得分:1)

自从我使用Expect已经有一段时间了,但我很确定你需要为Expect提供符合提示的内容:

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

例如。