检测命令的错误,如果命令使用Perl和Expect成功,则不会打印任何内容

时间:2013-07-12 08:56:38

标签: regex perl expect

我正在尝试使用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模块的缓冲区,或者是否可以通过其他方式实现这种错误检测?

我也想知道expect模块如何处理正则表达式。例如,如果我使用"^[$#]\$"作为正则表达式来匹配终端的提示,那么正则表达式的\$部分是否会匹配行尾或实际的美元符号?如果我删除了\ perl抱怨。

提前致谢!

/ Haso

编辑:我找到了解决方案:

解决方案是使用$com->clear_accum()来清除指责者。我以前尝试过使用它,但似乎这个函数只能随机工作,或者我不明白clear_accum()想要做什么。

编辑:关于clear_accum()的最终说明:

clear_accum()函数似乎随机工作的原因是因为在进行send调用之前,先前expect()生成的文本不会被读入控制器。因此,为了真正清除以前的所有数据,首先要执行expect()调用,然后清除控制器:

#To clear all previous data
$com->expect(0);
$com->clear_accum();

1 个答案:

答案 0 :(得分:0)

akarageo@Pal4op:~> cd banana
bash: cd: banana: No such file or directory
akarageo@Pal4op:~:( > echo $?
1

即。检查 CD 返回的错误代码,0表示确定其他任何错误,无需检查提示,顺便说一下,CD命令没有生成提示shell确实如此,所以这也必然是你困惑的一部分。

尝试$ object-> exitstatus(),如果有任何帮助