Makefile recipe中设置环境变量不生效,两种写法差异原因问询
Makefile两种环境变量写法差异原因
核心底层逻辑
Makefile执行目标下的每一行独立命令时,默认都会启动一个全新的独立Shell进程运行,不同进程的环境变量空间完全隔离,前一个进程设置的环境变量会随着进程退出销毁,无法传递给后续新启动的进程。
两种写法的具体差异
- 分两行写法(无效):
test: export Sample="Help" go run main.go
第一行export Sample="Help"在第一个Shell进程中执行,执行完成后该进程直接退出,设置的Sample变量也随之销毁。第二行go run main.go运行在第二个全新的Shell进程中,无法获取前一个进程的环境变量,因此Go程序读取不到对应值。
- 单行写法(有效):
test: Sample="Help" go run main.go
整行命令在同一个Shell进程中执行,命令前加变量=值是Shell的临时环境变量赋值语法,会将指定变量注入到当前进程后续启动的go run程序的运行环境中,因此Go程序可以正常读取。
扩展:分多行也能生效的写法
如果需要拆分多行编写,可以用反斜杠将多行命令标记为逻辑同一行,确保所有命令在同一个Shell进程中执行:
test: export Sample="Help" && \ go run main.go
如果变量需要全局生效,也可以在Makefile头部直接导出变量:
export Sample="Help" test: go run main.go
内容的提问来源于stack exchange,提问作者tanya sharma
相关产品推荐
相关产品推荐

