Как я могу сохранить результат системной команды в переменной Perl? - PullRequest
22 голосов
/ 04 октября 2010
$ 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
$

Я хочу записать результат, т.е. 11 в переменную.Как я могу это сделать?

Ответы [ 5 ]

49 голосов
/ 04 октября 2010

С Perlfaq8 :

Вы путаете назначение system () и backticks (``).system () запускает команду и возвращает информацию о состоянии выхода (как 16-битное значение: младшие 7 битов - это сигнал, от которого умер процесс, если таковые имеются, а старшие 8 битов - фактическое значение выхода).Обратные знаки (``) запускают команду и возвращают то, что она отправила в STDOUT.

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

Существует множество способов выполнить внешние команды из Perl.Большинство общих значений с их значениями:

  • system () : вы хотите выполнить команду и не хотите захватывать ее вывод
  • exec : вы не хотите возвращаться к вызывающему сценарию perl
  • backticks :вы хотите захватить вывод команды
  • open : вы хотите передать команду (как ввод или вывод) в ваш скрипт

Также см. Как захватить STDERR из внешней команды?

10 голосов
/ 04 октября 2010

Самый простой способ - использовать функцию `` в Perl. Это выполнит то, что внутри, и вернет то, что было напечатано на стандартный вывод:

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

Это должно сделать это.

7 голосов
/ 24 марта 2012

Попробуйте использовать qx{command} вместо обратных галочек. Для меня это немного лучше, потому что: вы можете использовать SQL с ним и не беспокоиться о экранировании кавычек и тому подобного. В зависимости от редактора и экрана мои старые глаза, как правило, пропускают крошечные отметки на спине, и у них никогда не должно быть проблем с перегрузкой, таких как использование угловых скобок или глобус.

2 голосов
/ 16 февраля 2016

Использование backtick или qx помогает, спасибо всем за ответы.Однако я обнаружил, что если вы используете backtick или qx, вывод содержит завершающий символ новой строки, и мне нужно удалить это.Поэтому я использовал chomp.

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

Больше информации здесь: http://irouble.blogspot.in/2011/04/perl-chomp-backticks.html

1 голос
/ 12 февраля 2019

Используйте backtick для системных команд, которые помогают сохранить их результат в переменной Perl.

my $ pid = 5892; my $ not = `` top -H -p $ pid -n 1 | grep myprocess | wc -l`; выведите "not = $ not \ n";

...