首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl Expect.pm将控制字符发送到子进程。

Perl Expect.pm将控制字符发送到子进程。
EN

Stack Overflow用户
提问于 2016-12-21 06:02:13
回答 1查看 265关注 0票数 0

我正在尝试编写一个脚本,它使用bash行编辑器来回忆以前输入的命令。下面是我试图自动化的简单会话。

代码语言:javascript
复制
$ bash --norc --noprofile
bash4.4$ echo hi
hi
bash4.4$

然后键入'^P^M‘

代码语言:javascript
复制
bash4.4$ echo hi
hi

这是我第一次尝试使用CPAN上的Expect.pm模块来编写脚本。这两个sleep 1是为了防止在调用行编辑器时出现争用条件的可能性,因为我不确定在发生这种情况时perl会看到什么。

代码语言:javascript
复制
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
use autodie;
use Expect;

my $timeout = 10;

my $exp = Expect->new();

$exp->spawn('bash --norc --noprofile');

# wait for first prompt
$exp->expect($timeout, '$ ');
# send echo hi
$exp->send("echo hi\n");
# wait for prompt again
$exp->expect($timeout, '$ ');
# use history recall ^P, then send ^M
sleep 1;
$exp->send("\cp\cm");
sleep 1;
print "okay done!\n";

直到我访问"\cp\cm" (我也尝试过"\cP\cM"),它才开始工作。根据perl文档,\cX引入了一个ASCII控制字符。(http://perldoc.perl.org/perlrebackslash.html#Character-Escapes)

控制字符\c用于表示控制字符;下面的字符决定构造的值。例如,\cA的值是chr(1),cb的值是chr(2),等等,血淋淋的细节在perlop中的Regexp类操作符中。对于ASCII和EBCDIC平台来说,chr(1)等意味着什么的完整列表是在perlebcdic中的操作符差异。

这就是我在运行脚本时得到的结果,它强烈地表明控制字符没有被正确地传递到子进程,而且可能根本没有被传递。

代码语言:javascript
复制
% perl bash.pl
bash-4.4$ echo hi
hi
bash-4.4$ okay done!

这里发生了什么事?如何使用Expect.pm将控制字符传递给进程?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-21 06:33:20

您正在搜索的字符转义是Perl regex特有的。为了您的目的,我建议您将hex value传递给ctrl-Mctrl-P

代码语言:javascript
复制
$exp->send("\x10"); # ctrl+P

$exp->send("\x0D"); # ctrl+M

更新(测试):

代码语言:javascript
复制
$exp->send("\x10"); # ctrl+P
$exp->send("\n"); # send newline
sleep 2;

# wait for prompt
$exp->expect($timeout, '$ ');

$exp->send("\x0D"); # ctrl+M
$exp->send("\n"); # send newline
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41256133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档