首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过Perl以编程方式控制交互式Unix应用程序?

如何通过Perl以编程方式控制交互式Unix应用程序?
EN

Stack Overflow用户
提问于 2009-09-24 11:12:41
回答 3查看 1.2K关注 0票数 7

我继承了一个已有20年历史的交互式命令行unix应用程序,它不再受到其供应商的支持。我们需要在这个应用程序中自动化一些任务。

其中最麻烦的是创建了数千条参数略有不同的新记录(例如,不同的标识符、不同的名称)。这些记录必须按顺序创建,一次只创建一个,这将需要很多个月(因此也是美元)手工创建。在大多数情况下,创建记录有一个非常可预测的模式,可以键入命令、读取响应、键入进一步的命令等等。然而,一些记录创建操作将导致错误条件(“带有此标识符的记录已经存在”),需要一组不同的命令才能优雅地退出。

我可以看到几种不同的方法来做到这一点:

  • 有名字的管道。编写一个Perl脚本,将STDIN和STDOUT设置为命名管道来运行目标应用程序,然后向目标应用程序发送命令序列,以创建具有所需参数的记录,然后指示目标应用程序退出并关闭。然后,根据需要使用不同的参数运行脚本多次。
  • 应用程序。找到另一个可以用于脚本交互程序的Unix工具。我唯一能找到的是期望,但这似乎并不是最重要的,我记得很久以前的聊天,它似乎或多或少地做了我想做的事情,但似乎只是为了控制调制解调器。

另一个潜在的复杂因素是:我认为目标应用程序是为VT100终端编写的,它使用某种转义序列来执行诸如提供高亮显示之类的操作。

我的问题是我应该采取什么方法?其中一个还是完全不同的东西?我非常喜欢使用命名管道,然后有一个Perl脚本来打开FIFO并根据需要进行读写,因为它提供了很大的灵活性,但从我所读到的来看,如果我沿着这条道路走下去,似乎会有很多潜在的问题。

提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-09-24 12:15:38

我肯定会坚持使用Perl来获得额外的灵活性,就像混乱所暗示的那样。你知道perl模块吗?这比命名管道法好得多。

还请注意,对于命名管道,您不能强迫从遗留应用程序返回的输出不缓冲,这可能会很烦人。我认为Expect.pm使用伪ttys来解决这个问题,但我不确定。有关更多细节,请参见perlipc“与另一个过程的双向沟通”一节中的讨论。

票数 12
EN

Stack Overflow用户

发布于 2009-09-24 11:19:50

expect比您可能认为的要可靠得多,但是如果我是您,我仍然会使用Perl选项,希望有一种完整而熟悉的编程语言来管理流程,并且相信无论出现什么奇怪的问题,都会有解决这些问题的方法。

票数 4
EN

Stack Overflow用户

发布于 2009-09-24 16:38:43

无论是使用Tcl还是Perl实现,Expect都将是我的第一次尝试。如果您在输出中看到奇数序列,因为它正在执行奇怪的终端操作,那么在进行匹配之前,只需从输出中过滤这些序列即可。

有了命名管道,您最终还是会重新发明Expect。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1471018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档