7

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

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

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

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

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

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

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

提前致谢。

4

3 回答 3

12

正如混乱所暗示的那样,我肯定会坚持使用 Perl 以获得额外的灵活性。你知道Expectperl 模块吗?它比命名管道方法好得多。

另请注意,对于命名管道,您不能强制从旧应用程序返回的输出无缓冲,这可能很烦人。我认为Expect.pm 使用伪 ttys 来解决这个问题,但我不确定。有关详细信息,请参阅“与另一个进程的双向通信”perlipc部分中的讨论。

于 2009-09-24T12:15:38.880 回答
4

expect比您可能认为的要可靠得多,但是如果我是您,我仍然会选择 Perl 选项,希望拥有一种完整且熟悉的编程语言来管理流程并有信心解决任何奇怪的问题出现,就会有解决它们的方法。

于 2009-09-24T11:19:50.943 回答
4

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

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

于 2009-09-24T16:38:43.887 回答