パラメータを使用してqemuを起動するシェルスクリプトは、「無効なオプション」につながります。

パラメータを使用してqemuを起動するシェルスクリプトは、「無効なオプション」につながります。

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[@]}"

おすすめ記事