我编写了一个 shell 脚本来使用 qemu 启动我的 win 10 VM。运行脚本会导致消息“无效选项”。我不明白这一点,因为如果我手动输入命令,qemu VM 会正常启动?
这是我的 shell 脚本:
#!/bin/bash
set -eu -o pipefail
IFS=$'\n\t'
VMkvm="-enable-kvm"
VMboot="-boot menu=on"
VMdisk="/home/john/VMs/win10.qcow2"
VMformat="qcow2"
VMmemory="4G"
VMcores="2"
VMcpu="host,hv_relaxed,hv_spinlocks=0x1fff,hv_vapic,hv_time"
VMaudio="-audiodev pa,id=snd0 -device ich9-intel-hda -device hda-output,audiodev=snd0"
VMusb=""
parameter="${VMkvm} ${VMboot} -drive file=${VMdisk},format=${VMformat} -m ${VMmemory} -smp ${VMcores} -cpu ${VMcpu} ${VMaudio} ${VMusb}"
qemu-system-x86_64 ${parameter}
这是我执行脚本的结果:
qemu-system-x86_64: -enable-kvm -boot menu=on -drive file=/home/john/VMs/win10.qcow2,format=qcow2 -m 4G -smp 2 -cpu host,hv_relaxed,hv_spinlocks=0x1fff,hv_vapic,hv_time -audiodev pa,id=snd0 -device ich9-intel-hda -device hda-output,audiodev=snd0 : invalid option
有趣的是,如果我复制错误消息并删除“qemu-system-x86_64”后的冒号,我的虚拟机就会启动。我的理解是实际的命令和参数都可以吗?那么我在脚本中使用参数启动 qemu 的方式有问题吗?我很困惑为什么这不起作用。提前感谢您的帮助!
答案1
您(不明智地)依赖于未加引号的变量的拆分${parameter}
来将空格分隔的字符串标记为单独的参数。
$ str="foo bar"
$ printf '%s\n' $str
foo
bar
但是,由于您设置IFS
的值不包含空格字符,因此不会发生此类拆分:
$ IFS=$'\n\t'
$ printf '%s\n' $str
foo bar
最好将论据集中在一个大批:
parameter=( "${VMkvm}" "${VMboot}" -drive file="${VMdisk},format=${VMformat}" -m "${VMmemory}" -smp "${VMcores}" -cpu "${VMcpu}" "${VMaudio}" "${VMusb}" )
然后
qemu-system-x86_64 "${parameter[@]}"