Makefile中Shell命令重定向后输出异常的原因及解决办法
问题原因及解决方法
原因
- Make的反斜杠转义规则:Makefile中反斜杠
\是转义字符,\\会被Make解析为单个\传递给Shell。第一个例子里,\\x64最终传给Shell的是\x64,结合bash内置echo -e能正常解析为字符d。 - Shell执行环境差异:当命令包含重定向(如
>> $@)时,GNU Make默认调用/bin/sh而非用户默认Shell(如bash)。多数系统中/bin/sh是dash这类轻量Shell,它的echo不支持-e扩展选项,会把-e和\x64直接当作普通字符串输出,导致文件内容变成-e \x64。而直接在终端运行时用的是bash,所以表现正常。
解决方法
方法一:指定Make使用bash执行命令
在Makefile开头添加一行,强制所有Shell命令用bash执行,bash的echo支持-e选项:
SHELL := /bin/bash all: @echo -n -e \\x64 >> $@
方法二:改用printf替代echo -e
printf的跨Shell兼容性更好,行为更稳定,无需依赖echo的扩展特性。修改命令为:
all: @printf '\x64' >> $@
注:Make不会解析单引号内的反斜杠,'\x64'会直接传递给printf,可正确解析为字符d。
内容的提问来源于stack exchange,提问作者Afshin
相关产品推荐
相关产品推荐

