开发工具

Shell 环境变量

Shell 环境变量详解

环境变量是 Shell 和应用程序用来存储配置信息的全局变量,它们决定了系统的行为和环境配置。以下是环境变量的核心知识点和实用技巧:

一、基础操作命令

查看所有环境变量

printenv    # 显示所有环境变量
env         # 类似 printenv
declare -p  # 显示所有变量(包括环境变量和局部变量)


查看单个变量

echo $PATH          # 标准写法
printenv HOME       # 使用 printenv 时不需要 $


设置环境变量

export VARNAME="value"  # 当前会话有效


临时生效(仅当前 Shell 和子进程):

TEMP_VAR="temporary" && export TEMP_VAR


删除环境变量

unset VARNAME


二、重要环境变量

变量名作用示例值
PATH可执行文件搜索路径/usr/bin:/usr/local/bin
HOME用户主目录路径/home/username
USER当前用户名ubuntu
SHELL当前 Shell 路径/bin/bash
PWD当前工作目录/var/www
LANG系统语言设置en_US.UTF-8
PS1命令行提示符格式\u@\h:\w\$


三、永久生效配置

用户级配置(~/.bashrc 或 ~/.zshrc)

echo 'export JAVA_HOME="/usr/lib/jvm/java-11"' >> ~/.bashrc
source ~/.bashrc  # 立即生效


系统级配置(/etc/environment 或 /etc/profile)

sudo sh -c 'echo "PATH=\"/usr/local/go/bin:$PATH\"" >> /etc/environment'


按会话类型配置:

图形界面:~/.profile
登录 Shell:~/.bash_profile
非登录 Shell:~/.bashrc


四、特殊技巧

追加路径到 PATH

export PATH="$PATH:/new/path"  # 安全追加


变量默认值处理

echo ${VAR:-"default"}  # 如果 VAR 未设置,返回 "default"
echo ${VAR:?"Not set"}  # 未设置时报错退出


跨脚本共享变量

# script1.sh
export SHARED_VAR="data"

# script2.sh
echo "Received: $SHARED_VAR"  # 能获取 script1 设置的变量


保护重要变量

readonly IMPORTANT_VAR="cant_change"
IMPORTANT_VAR="new"  # 报错:readonly variable


五、调试与故障排查

检查变量是否被设置

[ -z "$MISSING_VAR" ] && echo "Variable is unset"


查看变量修改历史

set | grep PATH  # 显示所有包含 PATH 的变量


环境变量与局部变量区别

LOCAL_VAR="only_in_current_shell"
export GLOBAL_VAR="visible_in_subshells"

# 在子 Shell 中测试
bash -c 'echo $LOCAL_VAR/$GLOBAL_VAR'  # 输出 "/value"


六、最佳实践

命名规范:全大写+下划线(如 APP_CONFIG_PATH)

敏感信息处理:

# 错误示范(密码会出现在历史记录中)
export DB_PASS="123456"

# 正确做法(交互式输入)
read -s -p "DB Password: " DB_PASS && export DB_PASS


多环境管理:

# 使用 .env 文件
set -a; source .env; set +a


七、常见问题解决

问题1:修改 PATH 后命令找不到

# 检查路径是否包含目标程序
echo $PATH | tr ':' '\n' | grep "bin"

# 典型修复(添加 /usr/local/bin)
export PATH="/usr/local/bin:$PATH"


问题2:变量值包含特殊字符

# 使用单引号防止扩展
export SQL_QUERY='SELECT * FROM users WHERE id="$1"'


问题3:SSH 会话不继承变量

# 在 ~/.ssh/environment 添加(需服务器允许)
echo "DEPLOY_ENV=production" >> ~/.ssh/environment
# 服务器配置:/etc/ssh/sshd_config 中设置 PermitUserEnvironment yes


通过掌握这些环境变量操作技巧,你可以:

1、高效配置开发环境

2、实现多环境隔离(开发/测试/生产)

3、安全管理系统敏感信息

4、快速排查环境相关问题