qemuを使用してWin 10 VMを起動するためのシェルスクリプトを作成しました。スクリプトを実行すると、「無効なオプション」というメッセージが表示されます。コマンドを手動で入力すると、qemu VMが正常に起動しますが、これは理解できませんか?
これは私のシェルスクリプトです。
#!/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[@]}"