Bash含空格变量单引号展开问题:Make命令传参失败
解决Bash脚本中make参数传递失败的问题
问题根源:你把引号硬编码进变量DD里了,Bash在展开变量时不会重新解析这些引号。执行make one $DD时,Shell会把CPPFLAGS='-DONE、-DTWO、-DTHREE'拆成三个独立参数传给make,这就导致make识别到无效选项报错。
给你两个解决方法:
方法一:使用Bash数组(推荐,安全可靠)
用数组来存储参数,能正确保留参数的结构:
DEFINES='-DONE -DTWO -DTHREE' # 定义数组,每个元素是一个完整的键值对参数 MAKE_ARGS=(CPPFLAGS="$DEFINES") # 调用make时展开数组,注意用双引号和[@] make one "${MAKE_ARGS[@]}" make two "${MAKE_ARGS[@]}"
这样Shell会把CPPFLAGS="-DONE -DTWO -DTHREE"作为一个独立参数传递给make,完全符合预期。
方法二:使用eval(不推荐,有安全风险)
如果一定要用字符串拼接的方式,可以借助eval让Shell重新解析引号,但要注意:如果DEFINES里包含特殊字符(比如空格、引号、通配符),可能会触发意外的命令执行,安全性差。
DEFINES='-DONE -DTWO -DTHREE' DD="CPPFLAGS='$DEFINES'" eval "make one $DD" eval "make two $DD"
内容的提问来源于stack exchange,提问作者Bulletmagnet
相关产品推荐
相关产品推荐

