Linux/bash中含内嵌变量的命令执行报错,如何解决?
解决Shell中含空格参数的命令执行问题
问题根源:直接执行$CMAKE_CONFIGURE_时,Shell会对变量展开结果进行单词拆分,你添加的转义双引号\"会被当成普通字符,无法起到包裹参数的作用,导致"Unix和Makefiles"被拆成两个独立参数,触发CMake的生成器识别错误。
以下是几种可行的解决方案:
方法1:用数组存储命令(推荐)
Shell数组能完美保留带空格的参数,避免拆分问题:
CMAKE=cmake GENERATOR="Unix Makefiles" # 将命令及每个参数作为数组元素单独存储 CMAKE_CONFIGURE_=("$CMAKE" "-G" "$GENERATOR") # 执行命令,注意数组展开的引号不能省略 "${CMAKE_CONFIGURE_[@]}"
"${CMAKE_CONFIGURE_[@]}"会把数组的每个元素作为独立参数传递,完全保留参数的原始格式。
方法2:用函数封装命令
如果需要多次执行该逻辑,函数的可读性和扩展性更好:
CMAKE=cmake GENERATOR="Unix Makefiles" cmake_configure() { # 直接在函数内调用命令,参数传递清晰 "$CMAKE" -G "$GENERATOR" "$@" } # 执行函数 cmake_configure
$@可以用来接收额外的参数,比如后续需要添加的CMake配置参数。
方法3:谨慎使用eval(不推荐)
如果必须用字符串存储命令,可以借助eval重新解析字符串,但要注意安全风险(若变量包含恶意内容会执行危险命令):
CMAKE=cmake GENERATOR="Unix Makefiles" CMAKE_CONFIGURE_="$CMAKE -G \"$GENERATOR\"" # 通过eval让转义引号生效 eval "$CMAKE_CONFIGURE_"
内容的提问来源于stack exchange,提问作者laultimapregunta
相关产品推荐
相关产品推荐

