环境变量 #

一、环境变量概述 #

1.1 什么是环境变量 #

环境变量是在操作系统中定义的变量,用于存储系统环境和用户配置信息。它们可以被Shell和子进程继承使用。

text
父进程(环境变量)
    ↓
子进程(继承环境变量)
    ↓
孙进程(继续继承)

1.2 环境变量与Shell变量 #

类型 定义方式 作用域 继承性
Shell变量 var=value 当前Shell 不继承
环境变量 export var=value 当前Shell及子进程 继承
bash
# Shell变量(不继承)
shell_var="普通变量"
bash -c 'echo $shell_var'    # 输出为空

# 环境变量(继承)
export env_var="环境变量"
bash -c 'echo $env_var'      # 输出: 环境变量

二、常用环境变量 #

2.1 系统环境变量 #

变量 说明 示例
PATH 命令搜索路径 /usr/bin:/bin
HOME 用户主目录 /home/user
USER 当前用户名 root
SHELL 当前Shell /bin/bash
PWD 当前工作目录 /home/user
HOSTNAME 主机名 localhost
LANG 语言设置 en_US.UTF-8
TERM 终端类型 xterm-256color

2.2 使用示例 #

bash
#!/bin/bash

echo "用户主目录: $HOME"
echo "当前用户: $USER"
echo "当前Shell: $SHELL"
echo "当前目录: $PWD"
echo "主机名: $HOSTNAME"
echo "语言设置: $LANG"
echo "终端类型: $TERM"

# 使用HOME变量
cd "$HOME"
echo "已切换到: $PWD"

# 使用USER变量
echo "当前用户是: $USER"

2.3 PATH变量详解 #

PATH变量定义了命令的搜索路径:

bash
# 查看PATH
echo $PATH
# /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

# 添加新路径
export PATH=$PATH:/new/path

# 添加到开头(优先搜索)
export PATH=/new/path:$PATH

# 查看命令位置
which ls
# /bin/ls

# 查看所有匹配的命令
whereis ls
# ls: /bin/ls /usr/share/man/man1/ls.1.gz

三、环境变量操作 #

3.1 设置环境变量 #

bash
# 方式一:export
export MY_VAR="value"

# 方式二:先定义后导出
MY_VAR="value"
export MY_VAR

# 方式三:一行设置并执行命令
MY_VAR="value" command

# 方式四:declare
declare -x MY_VAR="value"

3.2 查看环境变量 #

bash
# 查看所有环境变量
env

# 查看所有变量(包括Shell变量)
set

# 查看特定环境变量
echo $PATH
echo $HOME

# 使用printenv
printenv HOME
printenv PATH

# 搜索环境变量
env | grep JAVA

3.3 删除环境变量 #

bash
# 设置环境变量
export MY_VAR="value"

# 删除环境变量
unset MY_VAR

# 验证删除
echo $MY_VAR    # 输出为空

3.4 临时修改环境变量 #

bash
# 只在当前命令中生效
LANG=C ls --help

# 在子Shell中生效
(LANG=C; ls --help)

# 执行脚本时设置
MY_VAR="test" ./script.sh

四、配置文件 #

4.1 配置文件类型 #

文件 说明 加载时机
/etc/environment 系统环境变量 系统启动
/etc/profile 系统全局配置 登录Shell
/etc/profile.d/*.sh 系统脚本目录 登录Shell
~/.bash_profile 用户配置 登录Shell
~/.bashrc 用户配置 非登录Shell

4.2 配置环境变量 #

系统级配置(/etc/profile):

bash
# 编辑系统配置
sudo vim /etc/profile

# 添加环境变量
export JAVA_HOME=/usr/lib/jvm/java-11
export PATH=$PATH:$JAVA_HOME/bin

# 使配置生效
source /etc/profile

用户级配置(~/.bashrc):

bash
# 编辑用户配置
vim ~/.bashrc

# 添加环境变量
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin

# 添加自定义变量
export MY_PROJECT=$HOME/projects/myapp

# 使配置生效
source ~/.bashrc

4.3 推荐配置方式 #

创建独立的配置文件:

bash
# 创建自定义配置
vim ~/.bash_env

# 添加内容
export JAVA_HOME=/usr/lib/jvm/java-11
export MAVEN_HOME=/usr/local/maven
export GRADLE_HOME=/usr/local/gradle

export PATH=$PATH:$JAVA_HOME/bin
export PATH=$PATH:$MAVEN_HOME/bin
export PATH=$PATH:$GRADLE_HOME/bin

~/.bashrc 中加载:

bash
# 在 ~/.bashrc 末尾添加
if [ -f ~/.bash_env ]; then
    source ~/.bash_env
fi

五、常见开发环境配置 #

5.1 Java环境 #

bash
# ~/.bashrc 或 ~/.bash_env

export JAVA_HOME=/usr/lib/jvm/java-11-openjdk
export PATH=$PATH:$JAVA_HOME/bin

# 验证
java -version

5.2 Python环境 #

bash
# ~/.bashrc

# Python路径
export PYTHONPATH=$HOME/python_modules

# 虚拟环境
export VIRTUAL_ENV=$HOME/venv
export PATH=$VIRTUAL_ENV/bin:$PATH

# pyenv配置
export PYENV_ROOT=$HOME/.pyenv
export PATH=$PYENV_ROOT/bin:$PATH
eval "$(pyenv init -)"

5.3 Node.js环境 #

bash
# ~/.bashrc

# nvm配置
export NVM_DIR=$HOME/.nvm
[ -s "$NVM_DIR/nvm.sh" ] && source "$NVM_DIR/nvm.sh"

# npm全局包路径
export PATH=$PATH:$HOME/.npm-global/bin

# yarn路径
export PATH=$PATH:$HOME/.yarn/bin

5.4 Go环境 #

bash
# ~/.bashrc

export GOPATH=$HOME/go
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOBIN

# Go模块代理
export GOPROXY=https://goproxy.cn,direct

5.5 Rust环境 #

bash
# ~/.bashrc

export PATH=$PATH:$HOME/.cargo/bin

# Rust镜像源
export RUSTUP_DIST_SERVER=https://mirrors.tuna.tsinghua.edu.cn/rustup
export RUSTUP_UPDATE_ROOT=https://mirrors.tuna.tsinghua.edu.cn/rustup/rustup

六、环境变量最佳实践 #

6.1 命名规范 #

bash
# 推荐:大写字母,下划线分隔
export DATABASE_URL="mysql://localhost:3306/mydb"
export API_KEY="your-api-key"
export MAX_CONNECTIONS=100

# 不推荐:小写或混合
# export databaseUrl="..."  # 不推荐
# export database_url="..." # 不推荐(小写)

6.2 敏感信息处理 #

bash
# 不要在配置文件中硬编码密码
# 不推荐
export DB_PASSWORD="secret123"

# 推荐方式一:使用单独的密钥文件
if [ -f ~/.secrets ]; then
    source ~/.secrets
    chmod 600 ~/.secrets
fi

# 推荐方式二:运行时输入
read -s -p "请输入数据库密码: " DB_PASSWORD
export DB_PASSWORD

# 推荐方式三:使用环境变量文件
if [ -f .env ]; then
    export $(cat .env | xargs)
fi

6.3 条件设置 #

bash
# 只在变量未定义时设置
export JAVA_HOME=${JAVA_HOME:-/usr/lib/jvm/java-11}

# 条件添加PATH
if [ -d "$HOME/bin" ]; then
    export PATH=$HOME/bin:$PATH
fi

# 检查目录是否存在
if [ -d "/usr/local/go" ]; then
    export GOPATH=/usr/local/go
fi

6.4 模块化配置 #

bash
# ~/.bashrc

# 加载各种环境配置
load_env() {
    local env_file="$1"
    if [ -f "$env_file" ]; then
        source "$env_file"
        echo "已加载: $env_file"
    fi
}

# 加载开发环境
load_env ~/.env/java
load_env ~/.env/python
load_env ~/.env/node
load_env ~/.env/secrets

七、环境变量调试 #

7.1 查看变量来源 #

bash
# 查看变量是否定义
declare -p MY_VAR

# 查看变量属性
declare -p PATH

# 查看所有导出的变量
export -p

7.2 调试脚本环境 #

bash
#!/bin/bash

# 显示所有环境变量
echo "=== 环境变量 ==="
env | sort

echo ""
echo "=== Shell变量 ==="
set | sort

echo ""
echo "=== 特定变量 ==="
echo "PATH: $PATH"
echo "HOME: $HOME"
echo "USER: $USER"

7.3 比较环境差异 #

bash
# 保存当前环境
env > /tmp/env_before.txt

# 执行某些操作
source some_config.sh

# 保存新环境
env > /tmp/env_after.txt

# 比较差异
diff /tmp/env_before.txt /tmp/env_after.txt

八、总结 #

8.1 环境变量要点 #

要点 说明
定义 export VAR=value
查看 echo $VAR, env, printenv
删除 unset VAR
配置 ~/.bashrc, /etc/profile
继承 子进程自动继承

8.2 常用命令速查 #

bash
# 设置环境变量
export VAR=value

# 查看环境变量
echo $VAR
printenv VAR
env | grep VAR

# 删除环境变量
unset VAR

# 临时设置
VAR=value command

# 查看所有环境变量
env
printenv

8.3 下一步 #

你已经掌握了环境变量的使用,接下来让我们学习 数据类型,了解Shell中的数据类型!

最后更新:2026-03-27