macOS BigSur下执行.sh脚本配置JAVA_HOME不生效问题
问题根因
你执行./j16.sh时,操作系统会为这个脚本启动一个独立的子shell进程执行所有代码:
- echo命令的输出会直接打印到当前终端的标准输出流,所以你能正常看到"Java 16"的输出。
export设置的环境变量作用范围仅限当前进程及其派生的子进程,子shell执行完脚本后会直接退出,你当前操作的父shell(也就是你正在使用的zsh终端进程)的环境变量不会被子shell的修改影响,所以后续执行java --version用的还是父shell原本的JAVA_HOME配置。
你直接复制export命令到终端执行时,是直接修改当前父shell的环境变量,后续的java命令作为当前shell的子进程,自然能读到更新后的JAVA_HOME,所以版本切换生效。
正确操作方式
想要让脚本里的环境变量修改作用到当前shell,有两种常用方案:
- 使用
source命令或点操作符执行脚本,该操作会直接在当前shell进程中逐行执行脚本内容,不会启动独立子进程:source j16.sh # 或者简写为 . ./j16.sh - 把版本切换逻辑定义为shell函数写入
~/.zshrc配置文件,后续输入对应命令即可直接切换:
打开~/.zshrc添加如下内容:
保存后执行j16() { export JAVA_HOME=`/usr/libexec/java_home -v 16.0.1` echo Java 16 }source ~/.zshrc加载配置,之后直接输入j16即可完成版本切换。
内容的提问来源于stack exchange,提问作者ingo.mohr
相关产品推荐
相关产品推荐

