我正在尝试使用 perl 和 expect 模块自动配置服务器。我已经使用expect模块三天了,但现在我遇到了一个我无法解决的问题。
我的问题是当我执行一个命令时,如果成功则不打印输出,但如果出现问题则打印错误消息。此类命令的一个示例是以下cd
命令:
$ cd .
$
$ cd sadjksajdlaskd
sadjksajdlaskd: No such file or directory.
$
我想做的是将命令发送到服务器,然后执行expect
调用以检查是否打印了提示符号以外的内容。像这样的东西:
$com->send("cd $dir");
$com->expect(2,
["^[^$#]*", sub {
my $self = shift;
my $error = $self->match();
die "ERROR: $error";
}],
"-re", "^[$#]"
);
我遇到的问题是,当我执行expect
呼叫时,它将与所有先前的文本匹配,而不是与send
呼叫后收到的文本匹配,因此它将始终匹配并报告错误。如何使期望匹配仅与send
通话后收到的文本相匹配?是否可以清除期望模块的缓冲区,或者是否可以通过其他方式实现这种错误检测?
我也想知道 expect 模块如何处理正则表达式。例如,如果我"^[$#]\$"
用作正则表达式来匹配终端的提示,\$
那么正则表达式的一部分会匹配行尾还是实际的美元符号?如果我删除\
perl 抱怨。
提前致谢!
/哈索
编辑:我找到了解决方案:
解决方案是使用$com->clear_accum()
清除蓄能器的方法。我之前尝试过使用它,但似乎这个功能只能随机工作,或者我不明白clear_accum()
应该做什么。
编辑:关于clear_accum()
:
该clear_accum()
函数似乎随机工作的原因是因为从前一个生成的文本在调用之前send
不会读入累加器。expect()
所以要想真正清空之前的所有数据,就是先执行一次expect()
调用,然后清空累加器:
#To clear all previous data
$com->expect(0);
$com->clear_accum();