/etc/profile 是最稳妥的全局配置方式,因其为可执行脚本,支持 export、变量展开(如 $PATH)和条件判断,而 /etc/environment 仅支持静态键值对,不解析变量,无法拼接路径。

直接改 /etc/profile 是最稳妥的全局配置方式,但必须用 root 权限,且要小心别覆盖原有值。
为什么优先选 /etc/profile 而不是 /etc/environment
/etc/environment 看起来更“系统级”,但它不支持变量展开(比如不能写 $PATH),也不能执行命令,纯静态键值对。而 /etc/profile 是 shell 启动时执行的脚本,能用 export、能拼接路径、能做条件判断——实际配置 Java 或 MySQL 这类需要追加路径的场景,它才是真能干活的。
常见错误现象:echo $PATH 里没看到新加的路径,但 cat /etc/environment 确实写了。这就是因为该文件根本不会解析 $PATH,你写的 PATH="/usr/local/bin:$PATH" 会被原样当字符串存进去,失效。
- 只在登录 shell(如 SSH 登录、图形界面终端首次打开)时读取
- 所有用户共享,适合部署 JDK、Maven、Node.js 全局工具链
- 必须用
source /etc/profile才能立即生效,否则得新开终端或重新登录
export PATH=$PATH:/new/path 的顺序和冒号分隔细节
PATH 是用冒号 : 拼接的字符串,顺序决定查找优先级:前面的路径先被搜索。把新路径放前面(export PATH=/new/path:$PATH),你的本地二进制就优先于系统同名命令;放后面(export PATH=$PATH:/new/path)则作为兜底。
漏掉 $PATH 是高频翻车点。写成 export PATH=/opt/jdk/bin 直接清空整个 PATH,之后连 ls、cd 都会报 command not found。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 永远用
$PATH(带美元符)引用原值,不是PATH - 路径末尾不要加斜杠,
/opt/jdk/bin/和/opt/jdk/bin在某些 shell 下行为不一致 - 避免空格:路径含空格必须用引号包裹,但最好压根别用带空格的路径
用户级配置该动 ~/.bashrc 还是 ~/.bash_profile
大多数桌面环境开终端走的是 non-login shell,只读 ~/.bashrc;SSH 登录或虚拟控制台登录才走 login shell,读 ~/.bash_profile。所以只改一个容易漏生效。
标准做法是在 ~/.bash_profile 末尾加一句:source ~/.bashrc,然后把所有 export 都写进 ~/.bashrc。这样无论哪种方式启动终端,最终都加载同一份配置。
- 如果
~/.bash_profile不存在,新建即可,不必强求用~/.profile -
~/.bashrc里不要写交互式命令(比如echo "hello"),它可能被非交互式 shell(如脚本)source,导致输出污染 - 改完立刻验证:
source ~/.bashrc && echo $PATH,别等重启
JAVA_HOME 和 CLASSPATH 这类变量要不要配
现代 JDK(8u202+)和主流构建工具(Maven、Gradle)基本不依赖 CLASSPATH,硬配反而容易引发类冲突。除非你跑老项目或用 java -cp 手动指定,否则跳过 CLASSPATH 更安全。
JAVA_HOME 仍有价值:Tomcat、IntelliJ、某些 Shell 脚本靠它定位 JDK。但注意——它只要指向 JDK 根目录(如 /usr/lib/jvm/java-17-openjdk-amd64),不要带 /bin;且必须在 PATH 之前设置,否则 export PATH=$JAVA_HOME/bin:$PATH 会失败。
-
JAVA_HOME值里不能有符号链接,用readlink -f解析真实路径再赋值 - 设了
JAVA_HOME就别再单独往PATH加javac路径,统一用$JAVA_HOME/bin - 多个 JDK 共存时,用
update-alternatives --config java切换比手动改环境变量更可靠
真正麻烦的从来不是写那几行 export,而是改完后忘记 source,或者 PATH 里混进了不可访问的路径导致 shell 启动变慢——每次打开终端卡两秒,八成是某个 export PATH=xxx:$PATH 里的 xxx 目录权限不对或已删除。

















