Это вызвано неправильно настроенным разрешением на устройстве /dev/kvm
. Это должно иметь разрешение на чтение от группы kvm
. Шаги для решения:
/etc/udev/rules.d/65-kvm.rules
какroot
KERNEL=="kvm", NAME="%k", GROUP="kvm", MODE="0660"
udevadm control --reload-rules && udevadm trigger
kvm
, попробуйте выполнить qemu
с опцией -enable-kvm
. Это было давно исправлено в Arch Linux (, задача 14165, апрель 2009 г.). Возможно, вам также следует сообщить об этой проблеме в список разработчиков вашего дистрибутива.
Это Bash
функция, описанная вman bash
:
Referencing an array variable without a subscript is equivalent to referencing the array with a subscript of 0.
Если вы хотите распечатать все элементы массива files
:
echo "${files[@]}"
Также описано вman bash
:
${name[@]} expands each element of name to a separate word.
Вы также можете попробовать следующий фрагмент:
IFS=$'\n'
cp -a $( printf "source_path/%s\n" "${files[@]}" ) /destination_path/
Он также должен работать с именами файлов с пробелами.
$files
и ${files[0]}
эквивалентны, когда files
- это список, подобный тому, который у вас есть в вашем вопросе.
Обратите внимание, что "source_path/${files[@]}"
помещает source_path/
только перед первым элементом списка. Чтобы изменить список таким образом, чтобы каждый элемент начинался с некоторого пути, вы можете сделать
files=(... your list of files... )
for element in "${files[@]}"; do
files=( "${files[@]:1}" "source_path/$element" )
done
cp "${files[@]}" destanation_path
или вы можете просто cd
до source_path
перед выполнением cp
или добавить путь к фактическим именам одновременно с назначением значений в списке с самого начала.
Как указывали другие, $files
расширяется только до первого элемента массива, а "source_path/${files[@]}"
только прикрепляет «источник _путь/» к первому элементу. Но есть относительно простой способ получить все элементы с добавлением пути к каждому:
cp -a "${files[@]/#/source_path/}" "/destanation_path"
Это объединяет расширение всех -элементов([@]
)с подстановкой. /#
означает «заменить в начале строки», затем пустая строка для замены, затем /
для разграничения замены, затем «источник _путь/» как то, что нужно заменить (/добавить ). Это прикрепляет исходный путь к каждому элементу и не путает забавные символы в элементах, как это делают некоторые версии.
Обратите внимание, что в приведенном выше примере «источник _путь/» имеет косую черту в конце, но не в начале; "/" прямо перед ним является разделителем. Если бы он начинался с косой черты и содержал больше косых черт, например «/source/path/», он все равно работал бы :
.cp -a "${files[@]/#//source/path/}" "/destanation_path"