Linux 环境变量完全指南
概述
Linux 环境变量是系统运行和程序执行的重要配置机制,涵盖了从命令路径搜索、库文件搜索,到语言设置、调试开关等方方面面。理解环境变量的作用域(全局环境变量 vs 局部环境变量)、持久化方式(用户级 vs 系统级),以及如何在 Shell 脚本和程序中使用变量,是 Linux 熟练使用的关键一步。
基础语法
环境变量是存储在操作系统中的键值对,操作系统和应用程序通过读取这些变量来确定行为。Shell 中变量赋值使用 =(等号两边不能有空格),引用变量值使用 $ 符号。export 命令将变量导出为环境变量,使其对子进程可见。
- env:显示所有环境变量。
- echo $VAR:查看单个变量的值。
- export VAR=value:设置并导出环境变量。
- unset VAR:删除环境变量。
- source ~/.bashrc:重新加载配置文件使变更生效。
PATH 是最常用的环境变量,定义了 Shell 搜索命令的目录列表,目录之间用冒号分隔。新增 PATH 时要使用 $PATH 保留原有路径,否则会覆盖掉系统命令。
完整代码示例+注释
# === 查看环境变量 ===
env # 显示所有环境变量(完整列表)
printenv HOME # 显示特定变量
echo $HOME # 用 echo 也可以查看
echo $PATH # 查看命令搜索路径
echo $USER # 当前用户名
echo $SHELL # 当前使用的 Shell
=== 设置临时环境变量 ===
格式:export 变量名=值(等号两边无空格)
export APP_ENV=production
export LOG_LEVEL=debug
export MAX_CONNECTIONS=1000
只在当前命令执行时传入环境变量
APP_ENV=staging python app.py
=== PATH 环境变量的增删改 ===
追加新路径(推荐方式,保留原有 PATH)
export PATH=$PATH:/opt/myapp/bin
追加到 PATH 开头(优先使用)
export PATH=/opt/myapp/bin:$PATH
从 PATH 中移除某个目录
export PATH=$(echo $PATH | tr ':' '
' | grep -v '/usr/local/bad' | tr '
' ':' | sed 's/:$//')
=== 永久保存环境变量 ===
对当前用户永久生效:写入 ~/.bashrc
echo 'export EDITOR=vim' >> ~/.bashrc
echo 'export VISUAL=code' >> ~/.bashrc
source ~/.bashrc # 立即生效(不必重新登录)
对所有用户永久生效:写入 /etc/environment
该文件是纯文本,每行一个 VAR=value,直接编辑即可
系统级环境变量(Shell 脚本用):写入 /etc/profile.d/
创建文件如 /etc/profile.d/app-env.sh,内容如下:
export APP_HOME=/opt/myapp
export PATH=$APP_HOME/bin:$PATH
文件创建后重新登录即可加载
=== 常用环境变量详解 ===
LANG:语言和区域设置
export LANG=zh_CN.UTF-8
LD_LIBRARY_PATH:程序运行时搜索动态库的路径列表
export LD_LIBRARY_PATH=/opt/boost/lib:$LD_LIBRARY_PATH
PYTHONPATH:Python 模块搜索路径
export PYTHONPATH=/home/ubuntu/myproject/src:$PYTHONPATH
JAVA_HOME:Java 安装目录(某些 Java 工具依赖此变量)
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
GOPATH:Go 工作区路径
export GOPATH=/home/ubuntu/go
export PATH=$GOPATH/bin:$PATH
=== 在脚本中使用环境变量 ===
#!/bin/bash
test-env.sh
检查必要的环境变量
if [ -z "$APP_ENV" ]; then
echo "错误:APP_ENV 环境变量未设置"
exit 1
fi
根据环境变量选择配置
case $APP_ENV in
production)
DB_HOST=prod-db.example.com
;;
staging)
DB_HOST=staging-db.example.com
;;
development)
DB_HOST=localhost
;;
*)
echo "未知环境:$APP_ENV"
exit 1
;;
esac
echo "当前环境:$APP_ENV,数据库地址:$DB_HOST"
在脚本中导出变量给子进程
export DB_HOST
运行效果
执行 source ~/.bashrc 后,之前添加到 ~/.bashrc 中的环境变量会立即生效,无需重新打开终端。echo $PATH 会显示当前的命令搜索路径,新增的 /opt/myapp/bin 应该在末尾(如果之前没加的话)。执行 env | grep APP_ENV 可以看到刚才 export 的变量值是否已设置。
在 Shell 脚本中,环境变量默认不会传递给外部命令,除非使用 export。脚本中的变量是局部变量,只在脚本内部有效。通过 export 导出后,脚本调用的子命令和子脚本才能访问该变量。这一机制保证了脚本的封装性,避免污染调用者的环境。
常见问题
Q1:环境变量不生效怎么办
首先确认是否执行了 source(如果是修改了 ~/.bashrc)。图形界面下运行的程序(如 VSCode)不会读取 ~/.bashrc,因为它们不是 Shell 的子进程。需要将变量写入 ~/.profile 或 /etc/environment 才能被所有程序继承。如果是通过 systemd 服务运行的程序,环境变量需要写在 service 文件的 Environment= 字段中。
Q2:如何查看一个命令使用了哪些环境变量
可以用 strace -e open,openat,getdents64 -f command 来跟踪命令打开的文件和环境变量文件,或者用 ldd 命令查看二进制文件的动态链接库依赖。另一种方法是启动程序后查看 /proc/PID/environ,里面以空字节分隔了所有环境变量。
Q3:临时环境变量和永久环境变量的区别
临时环境变量通过 export 设置,仅在当前 Shell 会话有效,关闭终端或登出后消失。永久环境变量写入配置文件(~/.bashrc、/etc/profile.d/*.sh 等),每次启动新 Shell 时系统自动加载。/etc/environment 文件在系统层面始终会被读取,适合放置全局配置。
Q4:修改 LD_LIBRARY_PATH 有什么风险
LD_LIBRARY_PATH 会影响所有动态链接程序的库搜索路径,如果设置错误可能引发库版本冲突或加载错误。建议尽量避免在系统级设置 LD_LIBRARY_PATH,而是用 ldconfig 配置 ld.so.conf 或在编译时用 -rpath 嵌入库的搜索路径。只有在临时测试特定版本库时才使用 LD_LIBRARY_PATH。
延伸阅读
- Linux 官方文档 Environment Variables:Bash 手册中的环境变量说明。
- ldd 和 ld.so.conf:理解 Linux 动态链接器的搜索路径配置机制。
- systemd.exec:了解 systemd 服务中 Environment、EnvironmentFile 等环境变量配置选项。