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 = $notn";
$ perl test.pl
11
not = 0
$
je veux capturer le résultat i.e. 11
dans une variable. Comment puis-je le faire?
4 réponses
Vous êtes confus le but de system () et backticks (`). system () exécute une commande et renvoie les informations d'état de sortie (en valeur de 16 bits: les 7 bits les plus bas sont le signal dont le processus est mort, s'il y en a, et les 8 bits les plus hauts sont la valeur de sortie réelle). Backticks ( ` ) exécute une commande et renvoie ce qu'elle a envoyé à STDOUT.
$exit_status = system("mail-users");
$output_string = `ls`;
Il y a plusieurs façons d'exécuter des commandes externes à partir de Perl. La plupart des communes avec leurs significations sont les suivantes:
- system () : vous souhaitez exécuter une commande et ne veulent pas capturer sa sortie
- exec: vous ne voulez pas rentrer à la appel du script perl
- backticks : vous voulez capturer l' la sortie de la commande
- ouvrir: vous voulez tuyau de la commande (en tant que d'entrée ou de de sortie) de votre script
voir Aussi Comment puis-je capturer STDERR à partir d'une commande externe?
Le plus simple est d'utiliser le ``
fonctionnalité en Perl. Ceci 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.
Essayez d'utiliser qx{command}
plutôt que des bâtons. Pour moi, c'est un peu mieux parce que: vous pouvez faire SQL avec elle et ne pas vous soucier d'échapper des citations et autres. Selon l'éditeur et l'écran, mes vieux yeux ont tendance à manquer les petites tiques arrière, et il ne devrait pas avoir de problème à être surchargé comme l'utilisation de crochets d'angle contre glob.
en utilisant backtick
ou qx
aide, merci à tous pour les réponses. Cependant, j'ai trouvé que si vous utilisez backtick
ou qx
, la sortie contient newline et je dois supprimer cela. J'ai donc utilisé chomp
.
chomp($host = `hostname`);
chomp($domain = `domainname`);
$fqdn = $host.".".$domain;
plus d'information ici: http://irouble.blogspot.in/2011/04/perl-chomp-backticks.html