Makefile中export导出的变量如何在被调用的Shell脚本中访问
问题根因
Make 对目标下的每一行命令默认都会启动独立的子 Shell 进程执行,不同进程的环境变量互不传递。你第一行执行的 export 命令仅在当前行对应的子 Shell 生效,执行 s.sh 的是全新的子 Shell,自然读取不到变量。
解决方法
你可以选择以下任意一种方案实现变量传递:
- 方案1:合并命令到同一行执行
将变量导出和脚本执行放在同一行,让两者在同一个 Shell 进程内运行,修改后的 Makefile 如下:all: export name="foo" && ./s.sh - 方案2:在 Make 层面导出变量
直接使用 Make 的export语法定义并导出变量,该变量会被传递到所有命令执行的子 Shell 中,修改后的 Makefile 如下:export name = "foo" all: ./s.sh - 方案3:使用 .ONESHELL 特殊目标(GNU Make 3.82及以上版本支持)
声明.ONESHELL后,同一个目标下的所有命令会在同一个 Shell 进程中执行,原有写法无需调整即可生效:.ONESHELL: all: export name="foo" ./s.sh
内容的提问来源于stack exchange,提问作者aryan
相关产品推荐
相关产品推荐

