我对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秒钟收集标准输出,我能够得到一切。
如果有人能提供更详细的信息,我想知道发生了什么。
答案 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' );
例如。