关键看变量能否被子进程继承:printenv能查到的是全局(已export),echo能显但printenv无输出的是局部;改/etc/profile需source或新开终端才生效。

区分全局和局部环境变量,关键看变量能否被子进程继承,而不是看它“写在哪”或“有没有大写”。真正起作用的是 export 这个动作,以及变量是否进入了当前进程的环境块(environment block)。
怎么看一个变量是全局还是局部?
最直接的方法是用命令验证:
- 用 printenv 变量名 能查到 → 一定是全局(已导出)
- 用 echo $变量名 能显示值,但 printenv 变量名 无输出 → 是局部变量
- 用 set | grep ^变量名= 能看到,说明它存在于当前 shell 的变量表中,但不保证导出
为什么改了 /etc/profile 还不生效?
因为配置文件只是“写法”,不是“执行”。系统启动时只读取一次,终端打开后不会自动重载。必须手动触发:
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
- 新开终端:自动加载对应用户的 ~/.bashrc 或 ~/.profile
- 当前终端生效:运行 source ~/.bashrc(或对应配置文件)
- 注意:/etc/profile 对所有用户有效,但只影响登录 shell;非登录 shell(如 GNOME 终端默认启动方式)通常只读 ~/.bashrc
怎么让变量真正变成全局?
两步缺一不可:
- 先赋值:MY_TOOL=/opt/myapp(此时是局部)
- 再导出:export MY_TOOL 或合并写成 export MY_TOOL=/opt/myapp
- 验证:在当前终端执行 bash 进入子 shell,再 echo $MY_TOOL —— 能看到值才说明成功
PATH 和 JAVA_HOME 这类变量为什么特别容易配错?
问题常出在路径拼接和作用域上:
- PATH=$JAVA_HOME/bin:$PATH —— 顺序很重要,把自定义路径放前面才能优先命中
- 如果写成 PATH=$PATH:$JAVA_HOME/bin,而系统已有同名命令(比如 /usr/bin/java),就会被覆盖失效
- JAVA_HOME 本身不参与查找,但它被其他程序(如 Maven、Tomcat)读取,所以必须导出,否则这些工具找不到 JDK

















