我试图将命令字符串存储在变量中以供以后执行。问题在于该命令包含带有空格的参数参数。执行命令时,shell 不会将参数视为单个字符串,而是将其解释为两个字符串,包括双引号字符:
例子:
$ 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/')
我在谷歌上做了一些搜索,但没有找到任何答案。也许是因为我没有使用正确的术语。
编辑: 抱歉,我想我应该在 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}