如何配置Makefile覆盖.zshrc导出的环境变量值?
解决Makefile无法覆盖.zshrc环境变量的问题
你的问题核心在于:Makefile中每一行命令都是在独立的子shell进程里执行的,前一行的export只对当前子shell有效,既不会传递到下一行的命令,也无法修改父shell(你的zsh)里的环境变量。
以下是几种可行的解决方案:
方案一:合并命令到同一子shell
把需要共享环境变量的命令用&&连接,或者用反斜杠\换行连接,让它们在同一个子shell中执行,这样设置的环境变量就能生效:
prepare: # 单行写法 export TFR_DEV="" && export TFR_RELEASE="" && lein firebase-all $(instance-variables) # 多行换行写法 export TFR_DEV="" \ && export TFR_RELEASE="" \ && firebase use "$(firebase-name-prefix)$(TFR_RELEASE)"
方案二:用Makefile变量全局导出
直接在Makefile中定义变量,再通过export让所有子shell命令都能读取到这些值,整个目标下的命令都会使用覆盖后的变量:
# 可放在Makefile开头或prepare目标前 TFR_DEV := "" TFR_RELEASE := "" export TFR_DEV TFR_RELEASE prepare: lein firebase-all $(instance-variables) firebase use "$(firebase-name-prefix)$(TFR_RELEASE)"
方案三:执行make时临时传参覆盖
如果只是需要在本次make执行过程中覆盖环境变量,也可以直接在调用make时传入变量值,这会直接覆盖shell中的原有环境变量:
make prepare TFR_DEV="" TFR_RELEASE=""
注意:如果想要修改父shell(zsh)里的环境变量,Makefile做不到——子进程无法修改父进程的环境。这种场景你需要写一个shell脚本,然后用source 脚本名执行,让脚本在当前shell进程中运行才能实现。
内容的提问来源于stack exchange,提问作者Pedro Delfino
相关产品推荐
相关产品推荐

