Makefile中含转义TAB字符的Bash命令执行失败问题解决
GNU Makefile中Tab字符转义导致sort命令报错的解决办法
问题场景
在Ubuntu系统的GNU Makefile中编写了如下命令:
.PHONY: stack-use stack-use: $(BUILD_PATH)/$(TARGET).elf @cat build/*.su | sort -t$$'\t' -k2 -nr | awk -F'\t' '{ if($$2>0) {print $$0}}' | column -s$$'\t' -t
执行make -n stack-use时,输出的命令如下:
cat build/*.su | sort -t$'\t' -k2 -nr | awk -F'\t' '{ if($2>0) {print $0}}' | column -s$'\t' -t
直接运行该输出命令能得到预期结果,但通过make执行时却报错:
sort: multi-character tab ‘$\\t’
报错原因
Make在解析命令时会对反斜杠进行转义,导致Shell无法识别预期的TAB字符(\t),反而将其解析成了反斜杠加t的组合,因此sort命令认为分隔符是多字符的$\\t,从而报错。
解决办法
使用$(printf '\t')生成实际的Tab字符,替换原来的$$'\t'写法,避免转义问题。最终可用的Makefile命令如下:
.PHONY: stack-use stack-use: $(BUILD_PATH)/$(TARGET).elf @cat build/*.su | sort -t"$(printf '\t')" -k2 -nr | awk -F'\t' '{ if($$2>0) {print $$0}}' | column -s"$(printf '\t')" -t
内容的提问来源于stack exchange,提问作者user52366
相关产品推荐
相关产品推荐

