MAKE中使用-e作为前缀时addprefix函数无法正常工作的问题咨询
这不是Bug,是Shell的
echo命令在搞鬼! 你遇到的问题完全不是Make的addprefix函数的bug,而是shell环境中echo命令的特殊行为导致的。
问题原因分析:
当你在Make的shell命令里用echo输出内容时,很多系统默认的echo实现会把开头的-e识别为启用转义序列的命令选项,而不是普通的输出字符串。
看你的例子:
- 变量
b展开后是-s file1 -s file2 -s file3,echo不会把-s当成特殊选项,所以正常输出所有内容; - 变量
c展开后是-e file1 -e file2 -e file3,echo把第一个-e当成了命令选项直接忽略,只输出后面的内容,就出现了你看到的异常结果。
解决方法(任选其一即可):
1. 用双引号包裹输出变量
把echo的参数用双引号括起来,让整个字符串作为一个完整参数传给echo,这样它就不会解析开头的-e为选项了:
a := file1 file2 file3 b := $(addprefix -s , $(a)) c := $(addprefix -e , $(a)) all: @echo "$(b)" @echo "$(c)"
执行后就能得到预期输出:
-s file1 -s file2 -s file3 -e file1 -e file2 -e file3
2. 使用printf代替echo
printf不会像echo那样解析开头的短横线选项,行为更稳定:
a := file1 file2 file3 b := $(addprefix -s , $(a)) c := $(addprefix -e , $(a)) all: @printf "%s\n" "$(b)" @printf "%s\n" "$(c)"
3. 直接用Make的$(info)函数输出
如果不需要在shell阶段输出,可以用Make内置的$(info)函数在Make处理过程中打印内容,完全绕开shell的echo:
a := file1 file2 file3 b := $(addprefix -s , $(a)) c := $(addprefix -e , $(a)) all: $(info $(b)) $(info $(c))
内容的提问来源于stack exchange,提问作者Phi Quang Phuoc
相关产品推荐
相关产品推荐

