Подтвердить что ты не робот

Как сохранить результат системной команды в переменной 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
$

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

4b9b3361

Ответ 1

От Perlfaq8:

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

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

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