10

バッククォートを使用してスクリプトから外部プログラムを実行し、同時に STDOUT と STDERR の両方を 2 つの異なる変数でキャプチャしたいとします。どうやってやるの?たとえば、このスクリプトを実行すると...

my $cmd = `snmpwalk -v $version -c $community $hostname $oid`;

...エラーがない場合はすべて正常に動作しますが、コマンドでエラーが発生した場合、このエラーはコマンドラインに出力され、発生したくありません。エラーもキャプチャしたい。画面に何も印刷する必要はありません。何か案は?

4

4 に答える 4

13

まで行く必要はありませんopen3.IIRCは、外部コマンドを読み書きする必要がある場合にのみ使用されます.その場合でも、他の方法があります.

あなたの問題についてはCapture::Tiny、ブロック内で実行されるものからSTDOUTとSTDERRをキャプチャ(またはティー)できる を使用することをお勧めします。たとえば、質問ごとに:

#!/usr/bin/env perl

use strict;
use warnings;

use Capture::Tiny qw/capture/;

...

my ($stdout, $stderr) = capture {
  system ( "snmpwalk -v $version -c $community $hostname $oid" );
};

別の例として、次の機能コードを検討してください。

#!/usr/bin/env perl

use strict;
use warnings;

use Capture::Tiny qw/capture/;

my ($stdout, $stderr) = capture {
  system ( "echo 'hello'" );
  system ( "date" );
  warn "Arg1!";
};

print "STDOUT:\n$stdout";
print "STDERR:\n$stderr";

ちょうど私に与えた:

STDOUT:
hello
Mon Dec 19 23:59:06 CST 2011
STDERR:
Arg1! at ./test.pl line 11.
于 2011-12-20T06:00:30.087 に答える
8

バッククォートでこれを行う唯一の方法は、シェル コマンド内のファイルにリダイレクトすることです。

   my $cmd = `snmpwalk -v $version -c $community $hostname $oid 2>error.dat`;

スクリプト内で STDERR をキャプチャする場合は、バックティックの代わりにIPC::Open3が必要です。

于 2011-12-05T11:35:06.600 に答える
5

Perl FAQ には、どのように進めたいかによって、さまざまなオプションがあります。

http://perldoc.perl.org/perlfaq8.html#How-can-I-capture-STDERR-from-an-external-command%3f

于 2011-12-05T14:30:26.820 に答える
0

IO::キャプチャ出力

あなたがしたいことのための非常に便利なラッパーです。

于 2011-12-05T19:40:34.077 に答える