gpt4 book ai didi

perl - 将 Expect 与 Perl 一起使用并通过管道传输到文件

转载 作者:行者123 更新时间:2023-12-05 01:06:15 25 4
gpt4 key购买 nike

我对 Perl 还很陌生,一直在网上搜索有关我正在尝试做的事情的文档。我运气不好。

我有一个程序可以将信息输出到 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");

对于这种情况,只有一个提示让用户按“enter”。这个程序很小而且非常快 - 2 秒足以到达第一个提示。

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

有没有人对我如何捕获下半场有什么建议?

更新:我已经使用一个简单的脚本验证了这适用于 Expect:

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

其中“< Return >”是 Perl 脚本可以查找的冗长表达式。

注意:我已经尝试编写我的 Perl 脚本以期待“< Return >”...这没有区别。

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

有什么想法吗?

更新 2:

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

所以,我在编写的一些测试代码中输入错误...

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

注意尾随的 expect(2)...我不小心把它留在里面了,它起作用了!

因此,我试图了解正在发生的事情。 Unix expect 似乎不能这样工作!在 Perl 中实现的 Expect 似乎“期望”任何东西……而不仅仅是提示?

因此,我提供了另外 2 秒的时间来收集标准输出,并且我能够获得所有内容。

如果有人可以提供一些关于这里发生的事情的更详细信息,我很想了解发生了什么。

最佳答案

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

还有:

来自 Expect 文档常见问题解答部分的建议,这似乎可能是您的意外解决方案:

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).

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

关于perl - 将 Expect 与 Perl 一起使用并通过管道传输到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6550882/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com