【Linux】环境变量
Linux环境变量是用户态进程存储配置的键值对集合,内核仅负责在进程创建时传递环境表,实际解析由用户态程序完成。环境变量来源包括内核初始注入、Shell配置文件加载和父子进程继承。常见变量包括PATH、HOME、LANG等,分别用于命令搜索、用户目录和语言设置等。通过env、export等命令可查看和修改变量,C程序可通过main函数的env参数获取环境变量表。理解环境变量有助于排查程序运行问题并
1. 环境变量
1.1 如何理解 Linux 环境变量?
环境变量是 Linux 中用户态进程存储运行时配置信息的 “键值对(Key=Value)集合”,核心逻辑可从 3 个关键点理解:
-
存储与访问:进程地址空间的 “专属区域”
每个进程创建时,内核会在其地址空间中分配一块区域存 “环境表”(字符串数组),进程通过getenv()
(读)、setenv()
(写)等标准库函数操作;内核不解析变量含义,仅负责在进程创建(fork
)或加载(exec
)时,将父进程环境表 “拷贝” 给子进程。 -
作用域:“进程私有 + 父子继承”
默认仅当前进程及子进程有效(因继承机制),不影响其他进程。例如bash
中用export KEY=VALUE
声明的 “导出变量” 会传给子进程(如ls
、python
),未加export
的 “本地变量” 仅当前bash
可用。 -
语义解析:用户态程序 “自己说了算”
内核不关心变量意义,解析由用户态程序完成:比如 Shell 靠PATH
找可执行文件、git
用GIT_HOME
定位配置、应用用HOME
找用户目录,本质是程序间约定的 “配置传递规则”。
1.2 环境变量最开始从哪里来?
所有环境变量最终追溯至系统初始化的 “初始环境”,经 3 步传递扩展:
- 底层源头:内核启动时的 “初始注入”
内核完成启动(加载根目录、初始化硬件)后,会创建第一个用户态进程(如systemd
),并注入最基础的变量,来源包括:
- 内核编译配置(如
HOSTNAME
,由硬件 / 启动参数生成); - 启动加载器(
GRUB
)传递的参数(如ROOT
根目录、初始PATH
)。
- 核心扩展:登录 Shell 加载配置文件
用户登录时启动 “登录 Shell”(如bash
),会加载两类配置文件扩展变量:
- 系统级(对所有用户生效):
/etc/profile
、/etc/environment
; - 用户级(仅当前用户生效):
~/.bash_profile
、~/.bashrc
(bash
为例)。
这些文件会定义常用变量(如PATH=$PATH:/usr/local/bin
、LANG=en_US.UTF-8
)。
- 最终传递:子进程继承父进程环境
用户后续启动的程序(如vim
、docker
),会继承启动它的父进程(如 Shell)的环境变量,形成 “内核→初始化进程→登录 Shell→用户进程” 的完整传递链。
1.3 认识更多的环境变量
除了 PATH
,Linux 中还有许多常用环境变量,它们在系统运行和程序交互中扮演重要角色,按功能可分为以下几类:
1.3.1 用户与目录相关
HOME
:当前用户的主目录路径(如/home/yourname
或/root
),cd ~
本质就是切换到$HOME
。USER
/LOGNAME
:当前登录用户名(如yourname
或root
),程序可通过它识别用户身份。PWD
:当前工作目录的绝对路径(等价于pwd
命令输出),动态更新。OLDPWD
:上一次工作目录的路径,执行cd -
时会切换回这个目录。
1.3.2 系统与运行环境相关
LANG
/LC_ALL
:控制语言编码和本地化设置(如en_US.UTF-8
表示英文环境,zh_CN.UTF-8
表示中文环境),影响程序的字符显示、时间格式等。SHELL
:当前使用的 Shell 程序路径(如/bin/bash
或/usr/bin/zsh
)。TERM
:终端类型(如xterm-256color
),告诉程序终端支持的功能(如颜色、光标控制)。HOSTNAME
:当前主机的名称,可通过hostname
命令修改。
1.3.3 程序运行相关
PATH
:命令搜索路径(核心变量,已详述)。LD_LIBRARY_PATH
:动态链接库(.so
文件)的搜索路径,程序加载依赖库时会参考此变量。PYTHONPATH
/NODE_PATH
:特定编程语言(Python/Node.js)的模块搜索路径,扩展程序可导入的库目录。TZ
:时区设置(如Asia/Shanghai
表示北京时间),影响程序输出的时间戳。
1.3.4 临时与特殊用途
TMPDIR
:临时文件存放目录(通常为/tmp
),程序创建临时文件时会优先使用此路径。_
(下划线):记录上一条命令的最后一个参数或完整路径(如执行ls /home
后,$_
会等于/home
)。SSH_TTY
/SSH_CLIENT
:通过 SSH 登录时,记录 SSH 连接的终端和客户端信息(如客户端 IP)。
查看所有环境变量
执行 env
或 printenv
命令可列出当前 Shell 进程的所有环境变量;若想查看某个变量的值,直接输入 echo $变量名
(如 echo $HOME
)。
这些变量共同构成了程序运行的 “上下文信息”,理解它们能帮助排查命令执行异常(如 command not found
可能是 PATH
配置问题)、定制程序行为等。
1.4 和环境变量相关的参数
1.5 通过代码获取环境变量
1. 函数参数与环境变量的传递
在 C 语言中,main
函数的标准原型是 int main(int argc, char *argv[])
,但实际上还可以接收第三个参数 char *env[]
(或 char **env
),这个参数就是环境变量表。
- 当程序启动时,操作系统会将当前进程的环境变量以 “键值对字符串数组” 的形式,通过
env
参数传递给main
函数。 - 数组中每个元素是类似
KEY=VALUE
的字符串(例如PATH=/usr/bin
),数组末尾以NULL
结束(作为终止标记)。
#include <stdio.h>
int main(int argc, char *argv[], char *env[])
{
int i = 0;
for(; env[i]; i++){
printf("%s\n", env[i]);
}
return 0;
}
更多推荐
所有评论(0)