跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Shell / Bash

Linux 环境变量:作用、分类及自定义配置技巧

介绍 Linux 环境变量的基本概念、常见变量名(如 PATH、HOME)、分类(局部与全局)及配置方法。涵盖查看命令(echo、env、set)、命令行参数(argc/argv/envp)以及进程启动、地址空间与页表原理,帮助理解环境变量在系统运行中的作用。

JavaCoder发布于 2026/3/23更新于 2026/5/2716K 浏览
Linux 环境变量:作用、分类及自定义配置技巧

【一】环境变量介绍

环境变量:

是 Linux 系统中'存储全局信息的变量',供所有程序 / 命令调用

帮它们快速找到需要的资源,避免重复配置,即记录各种资源路径位置的变量

场景:我们执行各种指令,它需要环境变量去告诉它这个指令在哪里,不用我们写路径

【二】常见的环境变量名

各个环境变量名有自己的功能,可以利用 echo $环境变量名 进行查询各种信息

环境变量名作用(记录的内容是哈)查看方法(终端敲命令)例如(你的系统可能不一样)
PATH告诉系统'去哪里找命令'(最核心!)echo $PATH/usr/bin:/bin:/home/yourname/bin
HOME你的'家目录'路径(cd ~ 就是去这里)echo $HOME/home/yourname(普通用户)
USER当前登录的用户名(谁在用这个终端)echo $USERzhangsan
SHELL当前 Shell,它的值通常是/bin/bashecho $SHELLbin/bash

文章配图

【三】环境变量分类

环境变量也有作用范围,像上面的'常见环境变量名'属于全局变量,而根据分类也可分为局部变量

类型作用范围('能被谁看到')通俗例子
局部变量只在'当前终端窗口'生效,子窗口 / 其他程序看不到你在终端临时定义的 name=zhangsan
全局变量所有终端窗口、子程序都能看到(全局生效)PATH(命令路径)、HOME(你的家目录)

【四】环境变量添加

如果我们后面需要自己添加环境变量,那么根据分类添加时需要注意是全局还是局部:

直接定义变量(比如 age=20):默认是局部变量,只有当前终端能用,打开新终端就没了 用 export 声明(比如 export age=20):变成全局变量,新打开的子终端也能看到

例如:我们每次在执行编译好的可执行程序时,需要加前缀 ./,现在可以添加路径直接调用

(添加到系统的环境变量:环境变量名=$环境变量名 : 添加路径)

文章配图

例如:我现在要添加一个全局变量,需要使用 export 声明

文章配图

【五】环境变量查看

(1)可以使用 echo 查看已经存在的单个环境变量

例如:

文章配图

(2)使用 env 指令查看所有环境变量

例如:

文章配图

(3)使用 set 指令查看所有变量(含局部变量和函数)

(4)通过库函数 getenv()获取环境变量内容

#include <stdlib.h>
char *getenv(const char *name);

例如:

打印单个的环境变量

文章配图

文章配图

【六】命令行参数

命令行参数:

命令行参数可以理解成**'给程序的'额外指令''**,让程序知道'要做什么、用什么数据、以什么方式做'。这里我们以 main 函数的命令行参数为例!

(1)argc 与 argv

argc:统计命令行参数的'总数'

argv:存储命令行参数的'字符串数组',末尾是 nullptr

文章配图

文章配图

可以看到包括我们输入的 ./Hello 也是一个字符串,命令行参数从 0 开始,根据空格划分个数!

(2)env

env(或 envp):存储环境变量的'字符串数组',末尾是 nullptr

因此我们可以利用 env 来打印环境变量:

文章配图

文章配图

【七】进程的启动

进程启动时,会被传两张表:命令行参数表和 环境变量表。给这个进程提供各种路径和更多选项

每个进程都有专属的'当前工作目录'。当我们用 fork 函数创建自己的子进程之后,子进程可以在子进程的代码分支中调用 chdir 函数修改工作目录,而子进程的修改不影响父进程,二者是独立的

【八】进程地址空间

什么是进程地址空间?进程的产生到结束中间的过程是如何的?为方便理解,由现象->出概念!

(1)概述

首先我们用 fork 函数来产出一个子进程,然后更改父\子进程的数据,看看是什么现象:

文章配图

文章配图

可以看到虽然 n 的修改可以看出各个进程是独立的数据,但是注意 n 的地址每次都是相同的!

可以确认这里的 n 地址绝对不是物理地址,引入新概念:这里 n 地址属于虚拟地址(或线性地址)

(2)原理讲解

当一个进程被创建的时候,之前对它的解释是:进程=PCB 数据结构对象 + 代码数据,即:

但是今天要更加完善一些,需要引入且完善对进程的了解!

在进程的 PCB 被操作系统创建出来同时:

(1)会产生一个进程地址空间,由 PCB 内的指针指向它

	**进程地址空间**:进程地址空间理解为一个真正物理内存的**投影**,来**映射**该进程物理内存分布

						(既然是映射,那么物理内存的分布也回直接映射在虚拟内存)

	作用:**隔离**:进程之间互不干扰,一个进程崩溃不会影响系统和其他进程

						(防止该进程出现问题影响真正的物理内存,进而影响其它进程)

			**简化编程**:程序员不用关心真实物理内存布局,只用关心虚拟地址

						(不用管物理内存如何分布,只需要知道'有'这个地方就行)

(2)进程地址空间和真正的物理内存共同存在一个页表(Linux 使用页表**)** 来管理映射)里面,左边和右边各自放自己的地址,Linux 会通过页表存储的地址来拿到物理/进程地址空间

我们画出整个关系图,如下:

文章配图

(3)创建子进程

创建子进程时,子进程会拷贝父进程的进程地址空间和物理内存,如果子进程需要更改数据,再在物理内存上单独开一块空间达到互相独立的数据(写时拷贝):

文章配图

(4)页表

我们先看下面几个概念,结合图片理解:

(1)进程先访问的是虚拟地址(进程自己的真实物理映射地址)但数据实际存在物理内存(真实的硬件内存空间)里面

(2)CPU 要'翻译'虚拟地址时,得先找到页表在哪里。cr3 寄存器就是 CPU 里的一个特殊'指针',它存储着当前进程页表的起始地址

(3)页表:用来放进程地址空间和物理内存各个范围分布的地址,同时标注这块区域的权限和资源状态(比如 0 和 1)

文章配图

(4)进程要访问某个虚拟地址(比如执行一段代码、读取一个变量)时:

进程的代码数据不会全部加载到内存,而是按需加载,每次加载一部分(内存空间有限)

CPU 通过查询 cr3 指针找到页表中对应的这块资源状态,如果为 0(表示缺乏)会告诉操作系统需要去磁盘取这块资源,随后操作系统更新页表

【九】究极逻辑详解

**产生 PCB:**当一个进程被创建时,首先形成的是 PCB(task_struct 结构对象)

**产生进程地址空间和物理内存:**同时在 PCB 里面有一个指针指向了这个进程的进程地址空间(即虚拟内存,本质类似 PCB,也是一个结构对象),这个虚拟内存是这个进程在真实物理内存的映射,包含了物理内存的严格区域、范围划分等信息

**产生页表:**操作系统从进程地址空间中提取该进程的物理地址,同时为该进程生成页表,用来放置对应各个区域的虚、物理地址和权限、状态信息

**cr3 管理:**cr3 是 CPU 的控制寄存器,来指向当前进程的页表,通过 cr3,CPU 才可以访问到页表

当更新进程时,只需要完成 PCB 的描述 + 更换 cr3 指向(更新页表)即可!思维图如下:

**进程的运行:**当进程需要调/修改某个资源时,CPU 会通过 cr3 指针访问页表查看该资源空间对应的状态,如果缺乏会让操作系统去磁盘加载,或者权限不允许,则会结束该次请求

文章配图

进程 = 内核 PCB + 代码数据 + 进程地址空间 + 页表

目录

  1. 【一】环境变量介绍
  2. 【二】常见的环境变量名
  3. 【三】环境变量分类
  4. 【四】环境变量添加
  5. 【五】环境变量查看
  6. 【六】命令行参数
  7. (1)argc 与 argv
  8. (2)env
  9. 【七】进程的启动
  10. 【八】进程地址空间
  11. (1)概述
  12. (2)原理讲解
  13. (3)创建子进程
  14. (4)页表
  15. 【九】究极逻辑详解
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • GoLand 远程连接服务器开发配置指南
  • 基于 WebTop 与 Tailscale 实现云端 OpenClaw 真实桌面浏览器方案
  • Ubuntu 22.04 部署 OpenClaw 实战:多模型接入与网络搜索配置
  • C++ 基础:树上 LCA(最近公共祖先)求解方法
  • OpenClaw 智能体生态与移动端应用解析
  • Moji 2.0 小智 AI 桌面机器人复刻:基于乐鑫 ESP32 与大模型
  • CLAUDE.md 与 AGENTS.md 配置文件完全指南
  • C++ 异常机制详解与实践指南
  • Spring Boot 自定义注解实战:5 个高频场景详解
  • Web JS 逆向技术体系详解与 Python 实战复现
  • 数据结构:二叉树与堆的实现详解
  • Milvus 实战:Attu 可视化安装与 Python 整合指南
  • AIGC 时代:利用大模型辅助青少年编程学习与项目实践
  • AI 大模型核心概念、原理与应用全景解析
  • Dify 与 MySQL 深度融合:基于 MCP 协议的数据交互实践
  • LLaMA-Factory 配置文件详解:YAML 参数调优指南
  • TRAE 与 VSCode 的 Git 版本管理实战指南
  • Windows 7 系统下 Git 安装与配置指南
  • 线性动态规划经典例题解析
  • 医疗 NLP 实战:从电子病历分析到智能问答模型落地

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online