Linux中export仅在当前Shell标记变量供子进程继承,不修改系统配置;永久生效需将export语句写入对应初始化文件:~/.bashrc(新终端)、~/.profile(登录Shell)、/etc/environment(系统级,仅KEY=VALUE)、/etc/profile.d/*.sh(推荐全局配置)。

Linux中没有“导出变量到系统配置”这回事,export本身不写文件、不改系统配置。它只在当前Shell进程里把变量标记为“可传给子进程”,关掉终端就消失。所谓“让变量永久生效”,其实是手动把export语句加进Shell启动时自动读取的初始化文件里。
选对配置文件,决定生效范围
不同文件控制不同场景下的变量加载:
-
~/.bashrc:适合日常终端(GNOME Terminal、iTerm等),每次新开一个终端窗口都会执行。放个人常用路径或别名,比如
export PATH="$PATH:$HOME/bin" -
~/.bash_profile或~/.profile:适用于登录Shell(SSH登录、图形界面首次启动),只运行一次。适合设置
EDITOR、LANG这类影响整个会话的变量 -
/etc/environment:系统级,所有用户、所有Shell(包括桌面应用)都读,但语法极简——只认
KEY=VALUE格式,不能用$PATH、不能写export,也不能执行命令 -
/etc/profile.d/*.sh:推荐用于全局配置,支持完整Shell语法(含
export和变量展开),多个服务可各自放独立文件,互不干扰
写法必须规范,否则白改
即使文件选对了,下面这些错误会让变量根本不起作用:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 只写
MY_VAR=value却不加export,那只是局部变量,子进程看不见 - 拼PATH时写成
export PATH=/new/bin,直接覆盖原值;正确是export PATH="/new/bin:$PATH"或export PATH="$PATH:/new/bin" - 值含空格才需要引号,比如
export JAVA_HOME="/opt/java jdk";但export PATH="$PATH:/my/path"里的斜杠不用引号,加了反而可能干扰解析
改完必须重载,不然当前终端看不到
编辑完配置文件后,当前终端不会自动更新:
- 改了
~/.bashrc,运行source ~/.bashrc - 改了
/etc/environment,得重新登录或重启 - 改了
/etc/profile.d/xxx.sh,运行source /etc/profile即可立即生效
确认是否生效,别靠猜
检查变量有没有真正导出:
- 运行
export | grep MY_VAR,能查到说明已导出 - 运行
env | grep MY_VAR,能查到说明已进入环境(比export更严格) - 新开一个终端,再执行
echo $MY_VAR,有输出才算落地成功

















