我有一个脚本,使用system()在Expect中执行不同的命令。
对于大多数这些我不需要将STDOUT打印给用户,但在一种情况下,我希望只有一小部分输出打印给用户。我已经使用下面的方法为所有不同的命令重定向STDOUT等。
我的问题很简单,我怎样才能改变这一点,以便我可以收集某些变量中的所有输出并将一部分输出(例如,#34;组号= 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);
}
答案 0 :(得分: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
现在,要捕获输出,您有两个选项:
使用反引号(或qx()
运算符)
my $stdout = qx#./xxx.exp $cmd#;
重定向到文件并在文件中啜食:
my $ out_filename =“。/ something.out”; system(“./ xxxx.exp $ cmd&gt; $ out_filename 2&gt;&amp; 1”); #捕获STDOUT和STDERR 使用File :: Slurp; 我的@output = read_file($ out_filename);
打开管道并从中读取。
打开(我的$ output_fh,“。/ xxxx.exp $ cmd |”)或死掉“无法运行程序:$!\ n”; 而我的$ line(){ #用$ line做点什么 } 关闭($ output_fh);
使用标准IO模块之一。例如。您可以通过IPC::Open2