Linux 所有变量,严格按照内核进程机制、Shell解释器、PAM认证框架分为不同层级。很多面试、生产报错根源,都是混淆了「环境变量 / Shell本地变量 / PAM元数据」的存储位置与继承规则。
内核environ环境块:每个进程独有,存放标准环境变量,支持子进程继承,可通过env、/proc查看。
Shell本地内存变量:仅当前Shell进程内存,不写入内核environ,子进程完全看不到。
PAM Item元数据:存在PAM库内存结构体,不属于环境变量、不属于Shell变量,默认不对外暴露。
Linux不存在第七类变量,所有变量全部归属以下体系:
可持久化环境变量(PATH所属,可永久固化)
瞬时环境变量(程序注入)(SUDO_USER、SSH变量所属)
PAM内部元数据 Item(PAM_USER、PAM_RUSER所属)
Shell内置特殊变量(PWD、$$、$?等)
Shell自定义局部变量(普通本地变量、local函数变量、readonly变量)
进程单次临时变量(命令前置临时变量)
存放在内核进程environ中,支持写入磁盘配置文件永久生效,重启、新开终端不丢失;也可临时export仅当前会话生效。
✅ 写入配置可永久持久化
✅ 子进程默认继承
✅ env / printenv 可直接查看
✅ 系统、用户双层配置
PATH、HOME、SHELL、USER、LOGNAME、LANG、LC_ALL、LD_LIBRARY_PATH、EDITOR、http_proxy、XDG_*
修改配置后必须 source 文件名 或者重新登录生效。
同样存放在内核environ,属于标准环境变量、子进程可继承,但无任何磁盘配置文件,由第三方程序运行时动态注入,会话结束立即销毁,完全无法持久化。
✅ env可查看、子进程可继承
❌ 无法写入配置永久保存
❌ 重启/关终端立即丢失
SUDO_USER、SUDO_UID、SUDO_GID、SUDO_COMMAND
注意:su 切换用户不会生成这组变量,只有 sudo 才有。
SSH_CLIENT、SSH_CONNECTION、SSH_TTY
PAM认证框架的内存结构体数据,不是环境变量、不在environ、默认shell看不到。
只要走系统认证(login、ssh、su、sudo)就会生成,仅当前PAM会话有效。
PAM_USER:本次认证的目标用户(你切换到的用户)
PAM_RUSER:本次认证的原始发起用户(真实溯源用户)
PAM_RHOST:远程登录来源IP
PAM_TTY:当前终端设备
PAM_SERVICE:认证服务名(sshd/login/su)
SUDO_USER 是 sudo 程序自带环境变量;PAM_USER/PAM_RUSER 是系统PAM认证元数据,和sudo无绑定。
bash/zsh解释器自动维护的变量,仅存在Shell内存,不进入environ、子进程不继承、完全无法持久化。
PWD、OLDPWD、$$、$PPID、$?、$!、UID、EUID、RANDOM、SECONDS、BASHPID
属于纯Shell内存变量,不进内核环境块。包含三类:
NAME=123,仅当前Shell有效,子进程无效。
会话内不可修改、不可unset,可手动export提升为环境变量。
语法:KEY=VAL 命令
仅对当前这一条命令的子进程生效,当前Shell本身不保存,执行完立即销毁。
示例:DEBUG=1 ./app
| 操作场景 | SUDO_USER | PAM_USER(目标) | PAM_RUSER(原始) | LOGNAME | USER |
|---|
| alice 直接登录 | 空 | alice | 空 | alice | alice |
| alice su - root | 空 | root | alice | alice | root |
| alice sudo bash | alice | root | alice | alice | root |
| SSH远程登录alice | 空 | alice | 远程IP | alice | alice |
| 变量类型 | 存储位置 | env可见 | 子进程继承 | 可持久化 | 生命周期 |
|---|
| 可持久化环境变量(PATH) | 进程environ | ✅ | ✅ | ✅ | 永久有效 |
| 瞬时程序注入变量(SUDO_USER) | 进程environ | ✅ | ✅ | ❌ | 会话结束销毁 |
| PAM内部Item(PAM_USER) | PAM库内存 | ❌(映射后✅) | ❌ | ❌ | PAM会话结束释放 |
| Shell内置特殊变量(PWD/$$/$?) | Shell进程内存 | ❌ | ❌ | ❌ | 退出Shell销毁 |
| Shell局部变量(local/readonly) | Shell内存/函数栈 | ❌ | ❌ | ❌ | 函数/会话结束销毁 |
| 单次命令临时变量 | 子进程environ | ✅子进程可见 | ✅孙进程继承 | ❌ | 命令执行完销毁 |
PATH:属于可持久化环境变量,支持临时修改+永久写入配置。
SUDO_USER:sudo专属环境变量,su命令不生成,用于sudo溯源。
PAM_USER/PAM_RUSER:PAM内部元数据,不是环境变量,默认无法直接读取。
USER/LOGNAME区别:USER随切换用户变化,LOGNAME始终保留原始登录用户。
export作用:把Shell本地变量升级为内核environ环境变量,让子进程可以继承。
systemd服务误区:服务不读取bashrc/profile,所有Shell环境变量对系统服务无效。
最权威环境查看方式:cat /proc/$$/environ 内核原生环境,不受Shell影响。