如何打开命令行程序并保持其接受键盘输入?Perl能否操作Oracle adminclient?
问题解答
我来帮你解决这两个问题,尤其是你提到的Oracle adminclient的场景:
1. 如何打开命令行应用程序并使其保持打开状态以接受键盘输入?
一般有两种简单的实现方式:
- 直接启动:在系统的终端/命令提示符里直接运行目标CLI程序,它默认就会保持运行状态,等待你输入命令。
- 脚本启动(保留交互):如果要通过脚本启动,核心是让程序的输入、输出流直接对接当前终端的交互会话,不能被脚本接管后关闭。
2. Perl调用Oracle adminclient执行命令后保持手动交互的解决方案
你的代码没能达到预期,问题出在管道的使用上:open ORA, "| adminclient"会让adminclient的标准输入绑定到Perl的文件句柄,当你执行close(ORA)时,这个管道被关闭,adminclient检测到输入流中断就会退出,自然没法继续接受手动输入。
下面给你两种可行的解决办法:
方法一:用Perl的Expect模块接管交互
这个方法适合需要精确控制CLI程序执行步骤的场景,首先确保你安装了Perl的Expect模块(可以用cpanm Expect命令安装),然后试试这段代码:
use Expect; # 启动adminclient进程 my $exp = Expect->spawn('adminclient') or die "无法启动adminclient: $!"; # 等待adminclient出现提示符(请根据实际的提示符修改正则,比如OGG的提示符可能是`OGG>`) $exp->expect(10, '-re', qr/OGG>/); # 发送connect命令 $exp->send("connect http://xyz:9000 as oggadmin password xxxxxx\n"); # 等待命令执行完成,再次出现提示符 $exp->expect(10, '-re', qr/OGG>/); # 发送info all命令 $exp->send("info all\n"); # 等待提示符后,把终端控制权交还给你,此时就能手动输入命令了 $exp->interact();
interact()方法会把终端的控制权完全交给adminclient,之后你就像直接打开adminclient一样操作即可。
方法二:用系统shell命令实现快速启动
如果你的系统是类Unix环境,可以用bash的组合命令直接实现,不需要额外的Perl模块:
exec q{bash -c 'echo -e "connect http://xyz:9000 as oggadmin password xxxxxx\ninfo all\n" | cat - | adminclient'};
这个命令的原理是先把初始要执行的命令通过echo输出,然后用cat -把终端的标准输入对接给adminclient,这样adminclient在执行完初始命令后,会继续从终端读取你的手动输入。
补充说明
你的原代码本质是把adminclient当成了非交互式程序来调用,通过管道传递输入后就关闭了连接。而要保留交互,必须让adminclient直接关联到用户的终端(tty),这样它才能在脚本执行后继续接收键盘输入。
内容的提问来源于stack exchange,提问作者Chirag
相关产品推荐
相关产品推荐

