0

我有一个使用 system() 在 Expect 中执行不同命令的脚本。

对于其中的大多数,我不需要将 STDOUT 打印给用户,但在一种情况下,我只想将一小部分输出打印给用户。我已经使用下面的方法为所有不同的命令重定向 STDOUT 等。

我的问题很简单,我怎样才能改变它,以便我可以收集某个变量中的所有输出并将输出的一部分(例如“组号 = 12345”的字符串)打印给用户?

sub execute_cmd {   
my ($q) = @_;
my $para1 = $q->param('para1');
my $para2 = $q->param('para2');
my $para3 = $q->param('para3');
if($transtype eq "A") {
my $cmd = "\/\*ID\=66\*\/OOO LOIPAW\:XXX\=1\,ABC=K\'$para1\,DEF\=ALL\,GHI\=JKLMNO\,PQR\=$para2\;\r";
print $cmd;    
print "<br><br>";
open (TEMPERR, ">&STDERR");
open (TEMPOUT, ">&STDOUT");
open (STDERR, ">nul");
open (STDOUT, ">nul");
system ("./xxx.exp", $cmd);
open (STDERR, ">&TEMPERR");
open (STDOUT, ">&TEMPOUT");
close (TEMPERR);
close (TEMPOUT);
}
4

1 回答 1

1

您不需要花哨的 OUT/ERR 重定向来消除system()调用执行的命令的所有输出。

只需使用 shell 重定向:

system ("./xxx.exp $cmd > /dev/null"); # Get rid of STDOUT

system ("./xxx.exp $cmd > /dev/null 2>&1"); # Get rid of STDOUT AND STDERR

现在,要捕获输出,您有 2 个选项:

  1. 使用反引号(或qx()运算符)

    my $stdout = qx#./xxx.exp $cmd#;
    
  2. 重定向到文件并在文件中啜饮:

    我的 $out_filename = "./something.out"; 系统 ("./xxx.exp $cmd > $out_filename 2>&1"); # 捕获 STDOUT 和 STDERR 使用 File::Slurp; 我的@output = read_file($out_filename);

  3. 打开管道并从中读取。

    open(my $output_fh, "./xxx.exp $cmd |") or die "Can't run program: $!\n"; while my $line () { # Do something with $line } close($output_fh);

  4. 使用标准 IO 模块之一。例如,您可以绕过 Expect 并直接通过 OUT 和 IN 玩IPC::Open2

于 2013-02-04T13:35:31.897 回答