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