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

system()呼び出しによって実行されたコマンドからのすべての出力を排除するために、派手な OUT/ERR リダイレクトを行う必要はありません。

単純にシェル リダイレクトを使用します。

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. ファイルにリダイレクトして、ファイルを丸呑みします。

    my $out_filename = "./something.out"; システム ("./xxx.exp $cmd > $out_filename 2>&1"); # STDOUT と STDERR をキャプチャ use File::Slurp; 私の @output = read_file($out_filename);

  3. パイプを開き、そこから読み取ります。

    open(my $output_fh, "./xxx.exp $cmd |") または die "プログラムを実行できません: $!\n"; while my $line () { # $line で何かをする } close($output_fh);

  4. 標準 IO モジュールの 1 つを使用します。たとえば、Expect をバイパスして、直接 OUT と IN を使用して再生できます。IPC::Open2

于 2013-02-04T13:35:31.897 に答える