环境变量速查卡

本文是 PATH 深入与环境变量全书 的配套速查参考;基础概念见 第 6 章 Shell 入门


查看方式五兄弟

命令显示范围典型用途
env仅已导出的环境变量查看子进程将继承什么
printenv NAME单个变量脚本中判断存在性
set全部变量(含局部/函数)调试 Shell 内部状态
declare -p NAME单变量的类型与属性精确诊断变量属性
export -p所有导出声明(可直接重放)迁移环境定义

高频系统变量

变量含义备注
$PATH命令搜索路径,: 分隔顺序优先;勿加 .
$HOME当前用户主目录~ 的展开来源
$USER / $LOGNAME用户名登录时由 PAM 设置
$SHELL登录 Shellchsh 改变的是它
$PWD / $OLDPWD当前/上个目录cd - 用 OLDPWD
$HOSTNAME主机名
$TERM终端类型影响颜色与按键序列
$TMPDIR临时目录默认 /tmp
$LANG / $LC_ALL语言区域LC_ALL 覆盖一切 LC_*

高频行为控制变量

变量影响示例
http_proxy / https_proxycurl/wget/apt 等走代理export https_proxy=http://127.0.0.1:7890
no_proxy例外域名列表localhost,127.0.0.1,.internal
EDITOR / VISUALcrontab -e、git commit 用哪个编辑器export EDITOR=vim
PAGER / MANPAGERman/长输出分页器export MANPAGER='less -X'
HISTSIZE / HISTCONTROL历史条数/忽略规则ignorespace:erasedups
GPG_TTYgpg 签名 pinentry 报错修复export GPG_TTY=$(tty)
SSH_AUTH_SOCKssh-agent 套接字agent forwarding 核心

配置写入位置决策表

目标写在哪生效范围
所有用户 + GUI 会话/etc/environmentPAM 会话,纯 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 环境极简,无你的 PATHcrontab 里写绝对路径或显式 export
command not found(刚装的程序)未加入 PATH 或 hash 缓存hash -r;检查 PATH
scp/rsync 远程端莫名失败.bashrc 开头拦截了非交互 Shell把拦截语句移到 rc 尾部
GUI 应用读不到终端 exportdbus activation 独立环境dbus-update-activation-environment --all
sudo 后变量消失env_reset 安全策略sudo -E 或编辑 sudoers secure_path
中文乱码LANG 为 C/POSIXexport LANG=zh_CN.UTF-8

延伸阅读PATH 深入与环境变量全书(完整机制与实践) · Bash 编程基础(脚本中的变量) · systemd 服务管理(服务环境注入)