1. 环境变量

1.1 如何理解 Linux 环境变量?

环境变量是 Linux 中用户态进程存储运行时配置信息的 “键值对(Key=Value)集合”,核心逻辑可从 3 个关键点理解:

  1. 存储与访问:进程地址空间的 “专属区域”
    每个进程创建时,内核会在其地址空间中分配一块区域存 “环境表”(字符串数组),进程通过 getenv()(读)、setenv()(写)等标准库函数操作;内核不解析变量含义,仅负责在进程创建(fork)或加载(exec)时,将父进程环境表 “拷贝” 给子进程。

  2. 作用域:“进程私有 + 父子继承”
    默认仅当前进程及子进程有效(因继承机制),不影响其他进程。例如 bash 中用 export KEY=VALUE 声明的 “导出变量” 会传给子进程(如 lspython),未加 export 的 “本地变量” 仅当前 bash 可用。

  3. 语义解析:用户态程序 “自己说了算”
    内核不关心变量意义,解析由用户态程序完成:比如 Shell 靠 PATH 找可执行文件、git 用 GIT_HOME 定位配置、应用用 HOME 找用户目录,本质是程序间约定的 “配置传递规则”。

1.2 环境变量最开始从哪里来?

所有环境变量最终追溯至系统初始化的 “初始环境”,经 3 步传递扩展:

  1. 底层源头:内核启动时的 “初始注入”
    内核完成启动(加载根目录、初始化硬件)后,会创建第一个用户态进程(如 systemd),并注入最基础的变量,来源包括:
  • 内核编译配置(如 HOSTNAME,由硬件 / 启动参数生成);
  • 启动加载器(GRUB)传递的参数(如 ROOT 根目录、初始 PATH)。
  1. 核心扩展:登录 Shell 加载配置文件
    用户登录时启动 “登录 Shell”(如 bash),会加载两类配置文件扩展变量:
  • 系统级(对所有用户生效):/etc/profile/etc/environment
  • 用户级(仅当前用户生效):~/.bash_profile~/.bashrcbash 为例)。
    这些文件会定义常用变量(如 PATH=$PATH:/usr/local/binLANG=en_US.UTF-8)。

  1. 最终传递:子进程继承父进程环境
    用户后续启动的程序(如 vimdocker),会继承启动它的父进程(如 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. echo: 显示某个环境变量值
2 .export: 设置⼀个新的环境变量
3 .env: 显示所有环境变量
4. unset: 清除环境变量
5. set: 显示本地定义的shell变量和环境变量

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;
}

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐