web-dev-qa-db-fra.com

Comment puis-je stocker le résultat d'une commande système dans une variable Perl?

$ cat test.pl
my $pid = 5892;
my $not = system("top -H -p $pid -n 1 | grep myprocess | wc -l");
print "not = $not\n";
$ Perl test.pl
11
not = 0
$

Je veux capturer le résultat, c'est-à-dire 11 dans une variable. Comment puis je faire ça?

22
Lazer

De Perlfaq8 :

Vous confondez le but de system () et backticks (``). system () exécute une commande et renvoie des informations sur l'état de sortie (sous la forme d'une valeur de 16 bits: les 7 bits bas sont le signal d'où le processus est mort, le cas échéant, et les 8 bits hauts sont la valeur de sortie réelle). Les backticks (``) exécutent une commande et retournent ce qu'elle a envoyé à STDOUT.

$exit_status   = system("mail-users");
    $output_string = `ls`;

Il existe de nombreuses façons d'exécuter des commandes externes depuis Perl. Les plus communs avec leurs significations sont:

  • system (): vous voulez exécuter une commande et ne voulez pas capturer sa sortie
  • exec: vous ne voulez pas revenir au script Perl appelant
  • backticks: vous souhaitez capturer la sortie de la commande
  • open : vous souhaitez diriger la commande (en entrée ou en sortie) vers votre script

Voir aussi Comment puis-je capturer STDERR à partir d'une commande externe?

50
Nikhil Jain

Le moyen le plus simple consiste à utiliser le `` fonctionnalité en Perl. Cela exécutera ce qui est à l'intérieur et retournera ce qui a été imprimé à stdout:

 my $pid = 5892;
 my $var = `top -H -p $pid -n 1 | grep myprocess | wc -l`;
 print "not = $var\n";

Cela devrait le faire.

11
Peter Tillemans

Essayez d'utiliser qx{command} plutôt que des astuces. Pour moi, c'est un peu mieux parce que: vous pouvez faire du SQL avec et ne pas vous soucier d'échapper aux guillemets et autres. Selon l'éditeur et l'écran, mes vieux yeux ont tendance à manquer les minuscules tiques arrière, et il ne devrait jamais y avoir de problème de surcharge, comme l'utilisation de crochets angulaires par rapport à glob.

7
Ken Hylton

L'utilisation de backtick ou qx aide, merci à tous pour les réponses. Cependant, j'ai trouvé que si vous utilisez backtick ou qx, la sortie contient un saut de ligne et je dois le supprimer. J'ai donc utilisé chomp.

chomp($Host = `hostname`);
chomp($domain = `domainname`);
$fqdn = $Host.".".$domain;

Plus d'informations ici: http://irouble.blogspot.in/2011/04/Perl-chomp-backticks.html

2
Soumya Kanti

Utilisez backtick pour les commandes système qui aident à stocker leur résultat dans la variable Perl.

mon $ pid = 5892; mon $ pas = `` top -H -p $ pid -n 1 | grep myprocess | wc -l`; print "not = $ not\n";

1
Crazy coder