매개변수를 사용하여 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[@]}"

관련 정보