Как перехватить STDOUT и STDERR в двух разных переменных, используя Backticks в Perl - PullRequest
8 голосов
/ 05 декабря 2011

Допустим, я хочу запустить внешнюю программу из моего скрипта с обратными галочками и в то же время хочу захватить как STDOUT, так и STDERR, но в двух разных переменных.Как я могу это сделать?На всякий случай, если я запускаю этот скрипт ...

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

... если ошибки нет, все работает нормально, НО, если команда выдаст ошибку, эта ошибка будет напечатана в командной строке, и я нене хочу, чтобы это случилось.Я также хочу зафиксировать ошибку.Ничто не должно быть напечатано на экране.Есть идеи?

Ответы [ 4 ]

11 голосов
/ 20 декабря 2011

Вам не нужно идти до 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.
8 голосов
/ 05 декабря 2011

Единственный способ сделать это с помощью обратных галочек - это перенаправить в файл внутри команды оболочки:

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

Если вы хотите захватить STDERR внутри вашего скрипта, вам нужно IPC ::Open3 вместо кавычек

5 голосов
/ 05 декабря 2011

В Perl FAQ у вас есть разные варианты в зависимости от того, как вы хотите продолжить:

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

0 голосов
/ 05 декабря 2011

IO :: CaptureOutput

- очень удобная оболочка для того, что вы хотите сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...