SH/BASH: 변수에 공백이 포함된 명령 매개변수를 저장합니다.

SH/BASH: 변수에 공백이 포함된 명령 매개변수를 저장합니다.

나중에 실행하기 위해 명령 문자열을 변수에 저장하려고 합니다. 문제는 명령에 공백이 포함된 매개변수 인수가 포함되어 있다는 것입니다. 명령을 실행할 때 쉘은 인수를 단일 문자열로 처리하지 않고 큰따옴표 문자를 포함하여 두 개의 문자열로 해석합니다.

예:

$ CMD_CMAKE="cmake -G \"MSYS Makefiles\" ../../source/poppler-0.79/"

$ ${CMD_CMAKE}
CMake Error: Could not create named generator "MSYS

명령을 -G "MSYS Makefiles"전달 해야 합니다 . cmake반대로, -G \"MSYS그리고 Makefiles\"통과하고 있습니다.

나는 성공하지 않고 다음을 모두 시도했습니다.

$ CMD_CMAKE='cmake -G "MSYS Makefiles" ../../source/poppler-0.79/'

$ CMD_CMAKE="cmake -G 'MSYS Makefiles' ../../source/poppler-0.79/"

$ CMD_CMAKE="cmake -G MSYS\ Makefiles ../../source/poppler-0.79/"

$ CMD_CMAKE="cmake -G MSYS\\ Makefiles ../../source/poppler-0.79/"

$ GEN="MSYS Makefiles" && CMD_CMAKE="cmake -G ${GEN} ../../source/poppler-0.79/"

$ GEN="MSYS Makefiles" && CMD_CMAKE="cmake -G \"${GEN}\" ../../source/poppler-0.79/"

$ CMD_CMAKE=$(echo "cmake -G \"MSYS Makefiles\" ../../source/poppler-0.79/")

$ CMD_CMAKE=$(echo 'cmake -G "MSYS Makefiles" ../../source/poppler-0.79/')

Google에서 몇 가지 검색을 수행했지만 답변을 찾지 못했습니다. 어쩌면 제가 올바른 용어를 사용하지 않아서 그럴 수도 있습니다.

편집하다: 죄송합니다. 이 질문을 stackoverflow.com에 게시해야 한다고 생각했습니다.

답변1

이 솔루션을 찾는 데 도움을 준 jesse_b와 Kusalananda에게 감사드립니다.

사실 정말 쉽습니다. 명령과 인수를 저장하려면 배열에 넣고 모든 인수를 큰따옴표로 묶어 공백으로 묶습니다.

CMD_CMAKE=(cmake -G "MSYS Makefiles" ../../source/poppler-0.79/)

이를 실행하려면 변수를 큰따옴표로 묶어야 합니다.

"${CMD_CMAKE[@]}"

frabjous가 언급한 또 다른 해결책은 다음 명령을 사용하는 것입니다 eval.

CMD_CMAKE="cmake -G \"MSYS Makefiles\" ../../source/poppler-0.79/"
eval ${CMD_CMAKE}

관련 정보