Обработка результата выполнения команды в linux

В скрипте в первом цикле беру список ID виртуальных машин и хочу получить статус каждой из них. Для этого выполняю /usr/sbin/qm status $vm | awk '{print $2}'. Проблема в том, что команда выполняется до |, т. е. /usr/sbin/qm status $vm Подскажите как правильно построить цикл.

#!/usr/bin/perl

$first = 1;

print "{\n";
print "\t\"data\":[\n\n";

for (`ls -1 /etc/pve/qemu-server/ | cut --delimiter="." -f 1,1`)
{
    if ($_ eq "total 0\n")
            {
                    next;
            }

print "\t,\n" if not $first;
$first = 0;
$vm =$_;
chomp($vm);

foreach(`/usr/sbin/qm status $vm | awk '{print $2}'`) 
{
$line=$_;
}
print "\t{\n";
print "\t\t\"{#VM}\":\"$vm\",\n";
print "\t\t\"{#NAME}\":\"$vm\",\n";
print "\t\t\"{#STATUS}\":\"$line\"\n";
print "\t}\n";
}
print "\n\t]\n";
print "}\n";

Вывод первой команды:

102
103
104

Вывод второй команды:

status: running
status: running
status: running

Получить хочется просто running


Ответы (1 шт):

Автор решения: Владимир Ворников

Perl делает интерполяцию переменных перед выполнением backticks.

$1 в perl - это тоже переменная захвата. Perl унаследовал это имя от awk.

Экранируйте с помощью backslash знак $ в строке, передаваемой в backticks. И удалите переводы строк в $_, так как backticks их оставляет в списочном контексте вызывающей его функции:

for (`/usr/sbin/qm status $vm | awk '{print \$2}'`) {
  chomp;
  $line = $_;
→ Ссылка