Я думаю, вам нужно преобразовать необработанное изображение в qcow2 с помощью qemu -img. Образ qcow2 будет выделять диск только по мере необходимости (sparse ).
Например:
$ qemu-img convert -O qcow2 myimage.raw myimage.qcow2
Затем замените образ диска в определении виртуальной машины на образ qcow2.
Я подозреваю, что это просто проблема кавычек в кавычках, которые не работают должным образом.
Подсветка синтаксиса вашего кода дает подсказку о том, что происходит. Обратите внимание, что s/host_name/$line/
черный, а не красный, как остальная часть строки? Это потому, что вы фактически создали две строки с каким-то мусором, который bash не понимает посередине.
Примерно так должно работать
while read line; do
commands=$(sed -e "s/host_name/$line/" $2)
eval "$commands"
done < $1
Вы можете иметь как while read loop
, так иfor loop
A foor loop
, но для этого требуется mapfile
акаreadarray
mapfile -t commands < file2.txt
mapfile -t hosts < file1.txt
for h in "${hosts[@]}"; do
for c in "${commands[@]}"; do
echo command "$c" "$h"
done
done
Обычный обходной путь, если ваш bash недостаточно свежий, чтобы иметьmapfile
IFS=$'\n' read -rd '' -a array < file.txt
Или
while IFS= read -r file; do
array+=("$file")
done < file.txt
Теперь "${array[@]}"
содержит все значения/элементы.
Цикл while read
.
while IFS= read -ru "$fd" h; do
while IFS= read -r c; do
echo command "$c" "$h"
done < file2.txt
done {fd}< file1.txt
echo
, если вы считаете, что вывод правильный, чтобы он действительно мог выполнять команды. Предполагая, что оба файла имеют по одной записи в строке, встроенного command
должно быть достаточно, что означает отсутствие ;
для разделения нескольких команд в строке. Другое дело, да...eval
$fd
и {fd}
являются произвольными именами и используют произвольный дескриптор файла, если ваш bash недостаточно свеж, чтобы изменить его на 3
или выше, поскольку 0
на 2
уже занят. Необходимо использовать другой fd
на тот случай, если что-то в цикле while read
ест/хлюпает stdin
как, например, ssh
.