最稳妥的做法是往 /etc/profile.d/ 下放 .sh 脚本,因其由 /etc/profile 自动 source、加载靠后不被覆盖、支持变量展开和条件判断、便于卸载(删文件即可),且权限设为 644、以 .sh 结尾、不加 shebang。

直接改 /etc/profile 看似简单,但容易被后续脚本覆盖;用 /etc/environment 又不支持 $PATH 展开——最稳妥的做法是往 /etc/profile.d/ 下放一个 .sh 文件。
为什么优先选 /etc/profile.d/*.sh
这个目录里的脚本会在所有登录 shell 启动时被 /etc/profile 自动 source,且加载顺序靠后,不会被其他 profile.d 脚本覆盖。它支持完整 shell 语法(比如 $PATH 展开、条件判断),兼容 bash、dash、sh 等主流 shell,还便于卸载(删文件即可)。
常见错误现象:echo $PATH 看起来对了,但新用户登录后却没生效——大概率是脚本没放进 /etc/profile.d/,或权限不对。
- 文件必须以
.sh结尾(如/etc/profile.d/myapp.sh) - 内容只需写
export VAR_NAME="value",不用加#!/bin/sh(有些发行版会跳过带 shebang 的) - 权限设为
644即可(sudo chmod 644 /etc/profile.d/myapp.sh),不需要+x - 不要在
/etc/profile末尾硬加export PATH=...,否则可能被/etc/profile.d/里后加载的脚本覆盖
/etc/environment 不支持 $PATH 展开,但适合静态基础变量
/etc/environment 是 PAM 在系统启动早期读取的纯文本文件,不经过 shell 解析。所以写 PATH="/usr/local/bin:$PATH" 会导致 $PATH 字面量保留,最终 PATH 里真会出现 $PATH 这三个字符,命令全挂。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
适用场景:设置 LANG、LC_ALL、JAVA_HOME(值固定无依赖)这类不涉及变量展开的变量。
- 格式严格:每行一个
KEY="VALUE",等号两边不能有空格 - 修改后必须重新登录或重启才生效,
source完全无效 - 如果误写导致登录失败(比如 PATH 错成字面量),可在登录界面按
Ctrl+Alt+F1进命令行修复
验证是否真正全局生效
别只在当前 root 或自己的终端里 echo $VAR 就算完。要确认“所有用户”都拿到,得模拟不同上下文:
- 新开一个普通用户:运行
sudo -u nobody bash -c 'echo $PATH' - SSH 登录测试:从另一台机器
ssh user@localhost 'echo $MY_VAR' - 检查加载顺序:
grep -r "export.*PATH" /etc/profile.d/,看谁最后赋值 - 确认脚本被读到:
bash -l -c 'echo $0'(-l模拟登录 shell)
最容易被忽略的是权限和路径本身:即使 PATH 包含了 /opt/mytool/bin,如果该目录对目标用户不可执行(chmod 755 /opt/mytool/bin 缺失),或者里面脚本没 +x 权限,照样报 Permission denied。

















