如何在 Makefile 中正确执行 git log 并显示结果?
数据小许
结论
$(git log) 不会在 Makefile 中执行 shell 命令。GNU make 会将它解析为变量引用;如果没有定义名为 git log 的变量,展开结果就是空字符串。要显示 Git 日志,可以在 recipe 中直接运行 git log,也可以用 GNU make 的 $(shell ...) 函数获取命令输出。
题目中的代码是想让 get_log 目标打印 Git 提交记录。按 Makefile 语法,目标下方的命令属于 recipe,每行命令前都需要一个 Tab。
直接运行 Git 命令
如果只想显示日志,把命令放进 recipe 就可以:
SHELL := /bin/bash
get_log:
git log
运行 make get_log 时,make 会执行 git log,日志由该命令直接输出。这里没有用到 Bash 专属语法,所以不必设置 SHELL,保留也可以。
用 $(shell ...) 获取命令输出
如果要把命令结果嵌入 Makefile 表达式,可以这样写:
get_log:
@echo "$(shell git log -1 --oneline)"
$(shell command) 会让 make 执行命令,并将输出作为文本返回。这个例子只取最新的一条提交记录,适合显示为单行文本。要显示完整日志,通常直接运行 git log 更合适,因为 $(shell ...) 会把命令输出作为变量值处理,多行内容不一定能原样保留。
注意 recipe 的缩进
Makefile 中的 recipe 命令默认必须以 Tab 开头。如果 echo 行确实没有 Tab,make 会报格式错误;即使行首有 Tab,$(git log) 也不会执行 Git 命令,需要改用上面的写法。
备注:内容仅供参考。
