Linux 环境变量完全指南

小飞兽 Linux 356 次阅读 2026-06-05

概述

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。

    延伸阅读

    • ldd 和 ld.so.conf:理解 Linux 动态链接器的搜索路径配置机制。
    • systemd.exec:了解 systemd 服务中 Environment、EnvironmentFile 等环境变量配置选项。
  • 《Linux 高性能服务器编程》游渼源:包含对系统调用和进程运行环境的深度解析。