news 2026/5/27 17:39:38

《Linux 环境变量:读懂其作用、分类及自定义配置技巧》

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
《Linux 环境变量:读懂其作用、分类及自定义配置技巧》

前引:提到 Linux 环境变量,很多新手都会觉得它高深莫测,仿佛是一道难以跨越的技术门槛。实际上,环境变量并非遥不可及,它就存在于我们日常的 Linux 操作中,比如执行echo $PATH查看路径,或是配置 JDK 时设置JAVA_HOME。了解环境变量,不仅能帮助我们更好地理解 Linux 系统的运行逻辑,还能让我们根据自身需求自定义系统环境,提升操作便利性。本文将用通俗易懂的语言,带你走进 Linux 环境变量的世界,从它的基本作用、常见分类讲起,逐步教你掌握自定义配置的实用技巧,让你彻底告别对环境变量的 “陌生感”!

重点:【九】究极逻辑详解与逻辑图

目录

【一】环境变量介绍

【二】常见的环境变量名

【三】环境变量分类

【四】环境变量添加

【五】环境变量查看

【六】命令行参数

(1)argc与argv

(2)env

【七】进程的启动

【八】进程地址空间

(1)前引

(2)原理讲解

(3)创建子进程

(4)页表

【九】究极逻辑详解


【一】环境变量介绍

环境变量:

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

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

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

【二】常见的环境变量名

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

环境变量名作用(记录的内容是哈)查看方法(终端敲命令)
PATH告诉系统 “去哪里找命令”(最核心!)echo $PATH
HOME你的 “家目录” 路径(cd ~就是去这里)echo $HOME
USER当前登录的用户名(谁在用这个终端)echo $USER
SHELL当前Shell,它的值通常是/bin/bashecho $SHELL
LD_LIBRARY_PATH程序运行时找动态库的路径列表echo $LD_LIBRARY_PATH
.bashrc/.zshrc每次打开终端都会自动执行的配置文件echo $SHELL

例如:


【三】环境变量添加

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

(1)临时

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

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

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

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

(2)永久

先执行:echo $SHELL

  • 如果输出是/bin/bash:用.bashrc配置
  • 如果输出是/bin/zsh:用.zshrc配置

假设是输出是bash:nano ~/.bashrc,然后在末尾正常添加环境变量即可

【四】环境变量查看

(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 + 代码数据 + 进程地址空间 + 页表

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/27 17:38:02

医疗物联网(IoHT)实战:安全、通信与硬件设计全解析

1. IoHT技术全景&#xff1a;从概念到落地的核心挑战医疗物联网&#xff08;IoHT&#xff09;早已不是实验室里的概念&#xff0c;而是正在深刻改变我们获取和管理健康方式的一场静默革命。作为一名在医疗科技领域摸爬滚打了十多年的从业者&#xff0c;我亲眼见证了它从简单的数…

作者头像 李华
网站建设 2026/5/27 17:36:05

【最优化】从等式到不等式:拉格朗日乘子法的完整演进与应用解析

1. 拉格朗日乘子法&#xff1a;从等式约束开始 第一次接触拉格朗日乘子法时&#xff0c;我正被一个简单的资源分配问题困扰&#xff1a;如何在固定预算下最大化产品收益。这就像在超市购物&#xff0c;既要买够生活必需品&#xff0c;又不能超出钱包里的钱。拉格朗日乘子法就是…

作者头像 李华
网站建设 2026/5/27 17:32:03

数字视频指纹识别技术深度解析:Vidupe的智能去重架构设计

数字视频指纹识别技术深度解析&#xff1a;Vidupe的智能去重架构设计 【免费下载链接】vidupe Vidupe is a program that can find duplicate and similar video files. V1.211 released on 2019-09-18, Windows exe here: 项目地址: https://gitcode.com/gh_mirrors/vi/vidu…

作者头像 李华
网站建设 2026/5/27 17:31:09

WebVOWL可视化工具:3步快速掌握本体数据可视化的完整路径

WebVOWL可视化工具&#xff1a;3步快速掌握本体数据可视化的完整路径 【免费下载链接】WebVOWL Visualizing ontologies on the Web 项目地址: https://gitcode.com/gh_mirrors/we/WebVOWL 还在为复杂的RDF和OWL本体数据而头疼吗&#xff1f;WebVOWL为您提供了一种直观、…

作者头像 李华
网站建设 2026/5/27 17:29:07

Unity游戏里做个实时时钟UI?用C#的DateTime.Now和ToString()5分钟搞定

Unity游戏实时时钟UI&#xff1a;从基础实现到性能优化在游戏开发中&#xff0c;实时显示系统时间是一个看似简单却极具实用价值的功能。无论是RPG游戏中的昼夜系统&#xff0c;还是策略游戏的计时机制&#xff0c;甚至是简单的暂停菜单时间显示&#xff0c;一个稳定可靠的实时…

作者头像 李华
网站建设 2026/5/27 17:26:02

图片去水印免费工具有哪些?实测8款省心选

最近接了个老客户的活儿&#xff0c;要把三年前拍的一批产品图重新整理&#xff0c;结果翻出来一看傻眼了——当时合作的摄影工作室在每张图右下角都压了半透明 Logo 水印。客户那边已经换了品牌&#xff0c;旧 Logo 必须抹掉&#xff0c;三百多张图&#xff0c;一张张手动用 P…

作者头像 李华