环境变量速查卡
本文是 PATH 深入与环境变量全书 的配套速查参考;基础概念见 第 6 章 Shell 入门。
查看方式五兄弟
| 命令 | 显示范围 | 典型用途 |
|---|
env | 仅已导出的环境变量 | 查看子进程将继承什么 |
printenv NAME | 单个变量 | 脚本中判断存在性 |
set | 全部变量(含局部/函数) | 调试 Shell 内部状态 |
declare -p NAME | 单变量的类型与属性 | 精确诊断变量属性 |
export -p | 所有导出声明(可直接重放) | 迁移环境定义 |
高频系统变量
| 变量 | 含义 | 备注 |
|---|
$PATH | 命令搜索路径,: 分隔 | 顺序优先;勿加 . |
$HOME | 当前用户主目录 | ~ 的展开来源 |
$USER / $LOGNAME | 用户名 | 登录时由 PAM 设置 |
$SHELL | 登录 Shell | chsh 改变的是它 |
$PWD / $OLDPWD | 当前/上个目录 | cd - 用 OLDPWD |
$HOSTNAME | 主机名 | |
$TERM | 终端类型 | 影响颜色与按键序列 |
$TMPDIR | 临时目录 | 默认 /tmp |
$LANG / $LC_ALL | 语言区域 | LC_ALL 覆盖一切 LC_* |
高频行为控制变量
| 变量 | 影响 | 示例 |
|---|
http_proxy / https_proxy | curl/wget/apt 等走代理 | export https_proxy=http://127.0.0.1:7890 |
no_proxy | 例外域名列表 | localhost,127.0.0.1,.internal |
EDITOR / VISUAL | crontab -e、git commit 用哪个编辑器 | export EDITOR=vim |
PAGER / MANPAGER | man/长输出分页器 | export MANPAGER='less -X' |
HISTSIZE / HISTCONTROL | 历史条数/忽略规则 | ignorespace:erasedups |
GPG_TTY | gpg 签名 pinentry 报错修复 | export GPG_TTY=$(tty) |
SSH_AUTH_SOCK | ssh-agent 套接字 | agent forwarding 核心 |
配置写入位置决策表
| 目标 | 写在哪 | 生效范围 |
|---|
| 所有用户 + GUI 会话 | /etc/environment | PAM 会话,纯 KEY=value |
| 所有用户的登录 Shell | /etc/profile.d/xxx.sh | 登录 Shell 加载 |
| 个人所有交互会话 | ~/.bashrc | 交互式 Shell |
| 个人登录专属初始化 | ~/.profile 或 ~/.bash_profile | 登录一次 |
| systemd 服务 | Unit 内 Environment= 或 EnvironmentFile= | 该服务 |
| cron 任务 | 都不读!crontab 行内显式写或脚本内 source | 该任务 |
| 单次命令 | 前缀赋值 VAR=x cmd | 仅该命令 |
详细加载链路(登录/非登录/非交互)图解见 7.3 节。
常用片段复制区
# 把用户 bin 目录放到 PATH 最前(幂等写法)
case ":$PATH:" in
*":$HOME/.local/bin:"*) ;;
*) export PATH="$HOME/.local/bin:$PATH" ;;
esac
# JAVA_HOME 动态取值(跟随 alternatives)
export JAVA_HOME="$(dirname "$(dirname "$(readlink -f "$(which java)")")")"
# Python venv 手动等价操作
export VIRTUAL_ENV="$HOME/.venv/myproj"
export PATH="$VIRTUAL_ENV/bin:$PATH"
# 密钥文件加载(权限 600,加入 .gitignore)
[ -f ~/.env.secrets ] && set -a && source ~/.env.secrets && set +a
调试三板斧
diff <(env) <(env -i bash -lc '') # 找出被谁污染了环境
bash -lx ./script.sh # 跟踪每条命令的环境变化
sudo cat /proc/$(pgrep -f myapp)/environ | tr '\0' '\n' # 看运行中进程的真实环境
经典故障速查
| 现象 | 原因 | 处理 |
|---|
| cron 里命令找不到 | cron 环境极简,无你的 PATH | crontab 里写绝对路径或显式 export |
command not found(刚装的程序) | 未加入 PATH 或 hash 缓存 | hash -r;检查 PATH |
| scp/rsync 远程端莫名失败 | .bashrc 开头拦截了非交互 Shell | 把拦截语句移到 rc 尾部 |
| GUI 应用读不到终端 export | dbus activation 独立环境 | dbus-update-activation-environment --all |
| sudo 后变量消失 | env_reset 安全策略 | sudo -E 或编辑 sudoers secure_path |
| 中文乱码 | LANG 为 C/POSIX | export LANG=zh_CN.UTF-8 |
延伸阅读:PATH 深入与环境变量全书(完整机制与实践) · Bash 编程基础(脚本中的变量) · systemd 服务管理(服务环境注入)