Обработка результата выполнения команды в 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 = $_;