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