Comment capturer à la fois stdout et stderr dans deux variables différentes en utilisant les backticks en Perl

StackOverflow https://stackoverflow.com/questions/8384619

  •  28-10-2019
  •  | 
  •  

Question

Le mot Let Je veux lancer un programme externe de mon script avec des accents graves et en même temps je veux capturer à la fois STDOUT et STDERR mais dans deux variables différentes. Comment puis je faire ça? Pour istance si je lance ce script ...

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

... s'il n'y a pas d'erreur tout fonctionne très bien, mais si l'augmentation de la commande une erreur cette erreur sera imprimé sur la ligne de commande et je ne veux pas que cela se produise. Je veux saisir l'erreur aussi bien. Rien ne doit être imprimé à l'écran. Toutes les idées?

Était-ce utile?

La solution

Dans la FAQ Perl vous avez différentes options comment voulez-vous procéder:

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

Autres conseils

Vous ne devez pas aller tout le chemin à open3 qui IIRC est que lorsque vous avez besoin de lire et d'écrire à une commande externe, et même alors, il existe d'autres méthodes.

Pour votre problème, je suggère d'utiliser Capture::Tiny , qui peut capturer (ou même tee) STDOUT et STDERR de quoi que ce soit exécuté à l'intérieur de son bloc. Par exemple, par votre question:

#!/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" );
};

Pour un autre exemple, considérons ce code fonctionne:

#!/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";

qui m'a donné:

STDOUT:
hello
Mon Dec 19 23:59:06 CST 2011
STDERR:
Arg1! at ./test.pl line 11.

La seule façon de le faire avec des accents graves est de rediriger vers un fichier dans la commande shell:

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

Si vous voulez capturer le STDERR dans votre script, vous avez besoin IPC :: Open3 au lieu de contre-apostrophes

IO :: CaptureOutput

est un emballage très pratique pour ce que vous voulez faire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top