在Linux系统中,环境变量是操作系统和运行程序用于存储配置信息、路径、参数等关键数据的机制,它们以“键=值”的形式存在,作用于当前进程及其子进程,影响程序的行为、系统的运行方式以及用户的操作体验,理解如何定义和管理环境变量,是高效使用Linux系统的基础。

环境变量的基本概念与作用
环境变量分为“自定义环境变量”和“系统环境变量”两类,系统环境变量由Linux发行版或预装软件预设(如PATH、HOME、USER等),用于定义系统级默认行为;自定义环境变量则由用户根据需求创建,用于个性化配置(如开发工具路径、自定义脚本目录等),环境变量的核心作用包括:
- 配置程序运行路径:如
PATH变量告诉系统去哪些目录查找可执行文件; - 存储用户或系统信息:如
USER记录当前用户,HOME指向用户主目录; - 控制软件行为:如
JAVA_HOME指定Java安装路径,供Java程序调用; - 简化命令操作:通过自定义变量存储复杂路径或参数,减少重复输入。
定义环境变量的方法
根据作用范围和生效时效,定义环境变量的方法可分为三类:临时变量(当前会话有效)、用户级永久变量(当前用户长期有效)、系统级永久变量(所有用户长期有效)。
(一)临时定义环境变量(当前终端会话有效)
临时变量仅在当前终端会话中生效,关闭终端或注销后失效,适合临时测试或短期任务。
直接定义并导出变量
使用export命令将变量“导出”为环境变量,语法为:
export 变量名=变量值
示例:定义一个名为MY_TOOL的自定义工具路径,并导出为环境变量:
export MY_TOOL=/home/user/mytools # 定义变量并导出 echo $MY_TOOL # 查看变量值,输出:/home/user/mytools
注意事项:
- 等号两侧不能有空格,否则系统会报错;
- 变量值包含空格或特殊字符时,需用单引号或双引号包裹(单引号不解析变量,双引号会解析);
- 若变量值引用其他变量,需使用双引号,
export NEW_PATH="$MY_TOOL/bin"。
分步定义与导出
先定义变量(局部变量),再用export导出为环境变量:
MY_CONFIG=/etc/myapp/config # 定义局部变量 export MY_CONFIG # 导出为环境变量
(二)用户级永久定义环境变量(当前用户长期有效)
用户级变量存储在用户主目录的配置文件中,每次用户登录时自动加载,适合个人长期使用的配置(如开发环境变量)。

常用配置文件
Linux不同Shell(如Bash、Zsh)使用的配置文件不同,Bash Shell最常用的文件包括:
| 文件名 | 作用场景 | 加载时机 |
|——–|———-|———-|
| .bashrc | 交互式非登录Shell(如直接打开终端) | 每次打开终端时加载 |
| .bash_profile 或 .profile | 登录Shell(如通过SSH登录、切换用户) | 用户登录时加载 |
| .bash_login | .bash_profile不存在时的备选 | 用户登录时加载 |
推荐:日常修改.bashrc即可,因大多数终端操作属于交互式非登录Shell。
修改配置文件步骤
以.bashrc为例,添加环境变量:
- 打开配置文件(使用
vim、nano等编辑器):vim ~/.bashrc
- 文件末尾添加变量定义(格式同临时变量,无需重复
export,因配置文件已包含导出逻辑):# 自定义Java环境变量 export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 export PATH=$JAVA_HOME/bin:$PATH # 将Java bin目录加入PATH
说明:
$PATH表示引用原PATH变量值,为分隔符,避免覆盖原有路径。 - 保存文件并退出(
vim中wq保存退出)。 - 立即生效(无需重启终端):
source ~/.bashrc # 或执行 . ~/.bashrc(注意点号与空格)
验证变量是否生效
echo $JAVA_HOME # 输出Java安装路径 echo $PATH # 检查是否包含Java bin目录
(三)系统级永久定义环境变量(所有用户长期有效)
系统级变量对所有用户生效,需修改系统级配置文件,适合团队协作或系统级服务配置。
常用系统配置文件
| 文件名 | 作用 | 权限要求 | 注意事项 |
|---|---|---|---|
/etc/profile |
所有用户登录时加载,优先级高 | 需root权限 | 修改后需重启或重新登录生效 |
/etc/environment |
静态环境变量(无需export) |
需root权限 | 格式为变量名=值(无引号,无export) |
/etc/profile.d/ |
存放脚本文件(如.sh文件),按需加载 |
需root权限 | 推荐:新建脚本文件,避免直接修改/etc/profile |
推荐方法:通过/etc/profile.d/添加脚本
- 创建脚本文件(以
.sh为后缀,如my_env.sh):sudo vim /etc/profile.d/my_env.sh
- 添加变量定义(同用户级,需
export):# 系统级Node.js环境变量 export NODE_HOME=/usr/local/node-v16.18.0 export PATH=$NODE_HOME/bin:$PATH
- 保存退出,立即生效(无需重启):
source /etc/profile.d/my_env.sh
直接修改/etc/profile(不推荐,易影响系统)
若需直接修改,在文件末尾添加:
export NODE_HOME=/usr/local/node-v16.18.0 export PATH=$NODE_HOME/bin:$PATH
保存后执行source /etc/profile生效,或重启系统/用户登录。
修改/etc/environment(静态变量,无需export)
格式要求严格,每行一个变量,两侧无空格、无引号:

NODE_HOME=/usr/local/node-v16.18.0 PYTHONPATH=/usr/local/lib/python3.10/site-packages
修改后需重启或重新登录生效。
查看与管理环境变量
查看所有环境变量
printenv或env:显示所有环境变量(格式清晰,适合查看):printenv | grep PATH # 查看PATH变量
set:显示所有变量(包括局部变量和函数,信息较全):set | grep MY_TOOL
查看特定变量
echo $变量名:快速查看变量值:echo $JAVA_HOME
printenv 变量名:更正式的查看方式:printenv JAVA_HOME
删除变量
使用unset命令(仅对当前会话有效,若要永久删除需修改配置文件):
unset MY_TOOL # 删除变量 echo $MY_TOOL # 输出为空(表示变量已删除)
特殊环境变量示例
| 变量名 | 作用 | 常见值/示例 |
|---|---|---|
PATH |
系统可执行文件搜索路径 | /usr/local/bin:/usr/bin:/bin |
HOME |
用户主目录 | /home/username |
USER |
当前用户名 | root、ubuntu |
SHELL |
当前使用的Shell | /bin/bash、/bin/zsh |
LANG |
系统语言环境 | en_US.UTF-8、zh_CN.UTF-8 |
PWD |
当前工作目录 | /home/user/projects(由Shell自动更新) |
不同定义方式的对比
| 定义方式 | 作用范围 | 生效方式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|---|---|
临时变量(export) |
当前终端会话 | 立即生效 | 临时测试、短期任务 | 无需修改文件,快速生效 | 关闭终端后失效 |
用户级(.bashrc等) |
当前用户 | 重启终端或source后生效 |
个人长期配置(如开发环境) | 永久生效,不影响其他用户 | 需手动修改配置文件 |
系统级(/etc/profile.d/等) |
所有用户 | 重启或source后生效 |
系统级服务、团队协作 | 统一管理,多用户共享 | 修改需谨慎,可能影响系统稳定性 |
FAQs
问题1:为什么我在.bashrc中设置了环境变量,但新开的终端窗口还是不生效?
解答:.bashrc仅在交互式非登录Shell中加载,若通过SSH登录或使用su -切换用户,实际加载的是.bash_profile或.profile,解决方法:
- 将变量同时添加到
.bash_profile和.bashrc中; - 或使用
source ~/.bashrc手动加载当前终端的配置。
问题2:环境变量的值中包含空格或特殊字符(如、),如何正确设置?
解答:需用引号包裹变量值,根据需求选择单引号或双引号:
- 单引号:原样输出,不解析变量和特殊字符,
export MY_PATH='/home/user/my tools/$special'
- 双引号:解析变量和部分特殊字符(如、
),export BASE_DIR="/home/user" export MY_PATH="$BASE_DIR/my tools" # 解析后为:/home/user/my tools
若变量值包含双引号,可用转义字符
处理,export STR="He said: "Hello""。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/35815.html