环境变量 #
一、环境变量概述 #
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