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

Regex 如果命令使用Perl和Expect成功,则检测不打印任何内容的命令的错误,regex,perl,expect,Regex,Perl,Expect,我正在尝试使用perl和expect模块自动配置服务器。我已经使用expect模块三天了,但现在我遇到了一个无法解决的问题 我的问题是,当我执行一个命令时,如果成功,则不打印输出,但如果出现错误,则打印错误消息。此类命令的一个示例是cd命令: $ cd . $ $ cd sadjksajdlaskd sadjksajdlaskd: No such file or directory. $ 我想做的是将命令发送到服务器,然后执行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
调用后收到的文本匹配,因此它将始终匹配并报告错误。如何使expect仅与
send
调用后收到的文本匹配?是否可以清除expect模块的缓冲区,或者是否可以通过其他方式实现此类错误检测

我还想知道expect模块如何处理正则表达式。例如,如果我使用
“^[$\\]\$”
作为正则表达式来匹配终端的提示,正则表达式的
\$
部分是否匹配行尾或实际的美元符号?如果我删除
\
perl投诉

提前谢谢

/哈索

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

解决方案是使用
$com->clear_acum()
清除累加器。我以前试过使用它,但这个函数似乎只是随机工作的,或者我不明白
clear\u acum()
应该做什么

编辑:关于
clear\u acum()
的最后一个注释:

clear\u acum()
函数似乎随机工作的原因是,在进行
expect()
调用之前,从先前的
send
生成的文本不会读入accumelator。因此,要真正清除所有以前的数据,首先要执行
expect()
调用,然后清除accumelator:

#To clear all previous data
$com->expect(0);
$com->clear_accum();
i、 e.检查CD返回的错误代码,0表示OK,其他任何东西都是错误,无需检查提示,而且顺便说一句,CD命令不会生成shell所生成的提示,因此这也一定是混淆的一部分


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

您好,谢谢您的建议,不幸的是服务器没有bash。它包含某种shell,否则“exec(cd)”肯定无法工作。几乎所有shell都可以返回最后一个错误代码。在Unix系统中,所有系统都支持$,在windows中,我不太确定,可能是getLastErrorCode之类的。此外,请注意expect是用TCL编写的,您可以从中使用TCL原语!
akarageo@Pal4op:~> cd banana
bash: cd: banana: No such file or directory
akarageo@Pal4op:~:( > echo $?
1