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

时间:2009-09-24 11:12:42

标签: perl controls named-pipes

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

其中最麻烦的是创建数千个具有略微不同参数的新记录(例如,不同的标识符,不同的名称)。记录必须按顺序创建,一次一个,这需要花费许多个月(因此美元)来手动完成。在大多数情况下,创建记录具有非常可预测的键入命令,读取响应,键入其他命令等模式。但是,某些记录创建操作将导致错误条件(“具有此标识符的记录已存在”)一组不同的命令,可以优雅地退出。

我可以看到几种不同的方法:

  • 命名管道。编写运行目标应用程序的Perl脚本,并将STDIN和STDOUT设置为命名管道,然后向目标应用程序发送命令序列以创建具有所需参数的记录,然后指示目标应用程序退出和关闭。然后,我们根据需要使用不同的参数多次运行脚本。

  • 的应用。找到另一个可用于编写交互式程序脚本的Unix工具。我能找到的唯一的是expect,但这似乎并不是最重要的;和聊天,我记得很久以前,它似乎做了我想要的或多或少,但似乎只是为了控制调制解调器。

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

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

提前致谢。

3 个答案:

答案 0 :(得分:12)

正如混乱所暗示的那样,我绝对会坚持使用Perl来获得额外的灵活性。你知道Expect perl module吗?它比命名管道方法好很多。

另请注意,使用命名管道,您无法强制从遗留应用程序返回的输出无缓冲,这可能很烦人。我认为 Expect.pm使用伪ttys来解决这个问题,但我不确定。有关详细信息,请参阅perlipc部分"Bidirectional Communication with Another Process"中的讨论。

答案 1 :(得分:4)

expect比你可能给它的功能更加坚固,但如果我是你,我仍然会选择Perl选项,希望拥有一个完整而熟悉的编程语言来管理过程并确信无论出现什么奇怪的问题,都会有解决问题的方法。

答案 2 :(得分:4)

预计无论是使用Tcl还是Perl implementation,都是我的第一次尝试。如果您在输出中看到奇数序列,因为它正在做奇数终端事物,只需在进行匹配之前从输出中过滤掉这些序列。

使用命名管道,无论如何,你最终都会重新发明Expect。