Makefile中echo -e写文件时-e参数被写入内容的原因
问题根因
这个问题的核心是Makefile默认使用/bin/sh执行构建命令,不是你平时终端交互用的bash,不同shell里echo命令的实现逻辑完全不一样:
- Bash内置的
echo会把-e识别为开启转义符解析的选项,不会把它当内容输出 - 绝大多数Linux发行版里的
/bin/sh实际是dash这类轻量shell,它的内置echo遵循POSIX规范,根本不认-e这个选项,会直接把-e当成普通字符串打印,这就是你生成的desktop文件开头多出来-e的原因。
修复方案
三个方案选一个即可:
- 方案1:直接指定Make用bash跑命令,在Makefile最开头加一行配置:
加完之后所有命令都走bash解析,SHELL := /bin/bashecho -e就能正常工作。 - 方案2:换成
printf写文件,这个命令的转义行为在所有shell里都是统一的,不会有兼容问题,是最推荐的写法:
注意APIM_5 = printf "[Desktop Entry]\nName=$(MAIN)\nExec=$(MAIN)\nIcon=$(MAIN)\nType=Application\nVersion=1.0\nCategories=Utility;\n" > AppDir/usr/share/applications/$(MAIN).desktop;printf默认不会在内容末尾自动加换行,记得最后手动补一个\n。 - 方案3:显式调用系统里的独立echo程序,绕开shell内置的echo,这个方法兼容性差,不同发行版echo的路径可能不一样,不推荐:
APIM_5 = /bin/echo -e "[Desktop Entry]\nName=$(MAIN)\nExec=$(MAIN)\nIcon=$(MAIN)\nType=Application\nVersion=1.0\nCategories=Utility;" > AppDir/usr/share/applications/$(MAIN).desktop;
额外提醒:你现在把所有构建命令用分号串在同一行执行,
APIM_1里的cd output;会把后续所有命令的工作目录切到output文件夹下,你后面创建的AppDir实际会生成在output目录里,如果和你预期的路径不一致要记得调整。
内容的提问来源于stack exchange,提问作者no more sigsegv
相关产品推荐
相关产品推荐

