如何在Makefile中传递含空格的字符串参数?
解决Makefile传递带空格字符串参数的问题
这个问题我之前也碰到过,本质是Make和shell对空格参数的解析逻辑差异导致的,咱们一步步来搞定它:
问题根源
你执行make git msg="My message"时,Make会把msg的内容解析成My message(不带外层的双引号)。当Make执行规则里的git commit -m $(msg)时,shell会把这条命令拆分成git commit -m My message——这时候git会把My当成提交信息,message当成要提交的路径参数,自然就会报pathspec 'message' did not match any file(s)的错误了。
解决方案
方案1:在Makefile规则里给变量加双引号
这是最常用的简单解法,直接在规则里把$(msg)用双引号包裹起来,让shell把整个字符串当成一个参数:
git: git commit -m "$(msg)"
执行时还是用你原来的命令:
make git msg="My message"
方案2:使用Make的value函数处理特殊字符
如果你的提交信息里可能包含双引号(比如msg='He said "Hello"'),上面的方案会出问题,这时候可以用Make的value函数直接获取变量的原始值,再用单引号包裹:
git: git commit -m '$(value msg)'
执行命令时可以灵活用单双引号:
make git msg='He said "Hello"'
测试验证
可以先写个简单的测试规则确认参数传递是否正确:
test: @echo 原始输出:$(msg) @echo 带双引号的输出:"$(msg)" @echo 使用value函数:'$(value msg)'
执行make test msg="Hello World!",你会看到输出里空格完整保留,没有被拆分。
内容的提问来源于stack exchange,提问作者B. George
相关产品推荐
相关产品推荐

