如何在Makefile目标中实现$(<some-file)等效功能且保留文件换行符
问题根因
你遇到的换行丢失问题是$(shell)函数的固有特性导致的:Make执行$(shell cat 文件名)读取文件内容时,会默认将输出中的所有换行符替换为单个空格,最终提交的YAML内容被拼接为单行,不符合语法规范触发校验报错。
解决方案
不要使用Make的$(shell)读取文件,将文件读取逻辑完全交给执行命令的Shell处理:对Makefile中需要透传给Shell的$符号,统一用$$转义即可,转义后Shell会按照你原本在终端执行的逻辑读取完整的文件内容,保留所有换行符。
完整可运行Makefile示例
# 定义GitLab CI文件路径,默认读取当前目录下的.gitlab-ci.yml GITLAB_CI_FILE_PATH ?= .gitlab-ci.yml # 声明lint为伪目标,避免和同名文件冲突 .PHONY: lint lint: jq --null-input --arg yaml "$$(<$(GITLAB_CI_FILE_PATH))" '.content=$$yaml' | \ curl "https://gitlab.com/api/v4/ci/lint" \ --header "Content-Type: application/json" \ --header "PRIVATE-TOKEN: $(GITLAB_PERSONAL_ACCESS_TOKEN)" \ --data @-
注意事项
- Makefile中目标下的执行命令必须使用Tab缩进,不能替换为空格,否则会触发Make语法错误
- 私有令牌可以提前导出为环境变量
export GITLAB_PERSONAL_ACCESS_TOKEN=你的令牌值,也可以执行命令时动态传入:make GITLAB_PERSONAL_ACCESS_TOKEN=你的令牌值 lint
内容的提问来源于stack exchange,提问作者adamcunnington
相关产品推荐
相关产品推荐

