【Linux】从开发到系统管理深入理解环境变量
文章目录
- 前言
- 一、环境变量概念
- 1.1 为什么需要环境变量?
- 1.2 环境变量的本质特征
- 二、环境变量PATH
- 2.1 PATH的运作机制
- 2.2 常见环境变量及其作用
- 2.3 环境变量操作指南
- 三、再谈环境变量
- 3.1main函数命令行参数解析
- 3.2 环境变量的继承机制
- 3.3 本地变量与内部构建命令
- 总结
前言
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。其在计算机中的结构形式一般是name + value(kv)。
在Windows中,我们有时候在安装某种软件时也需要更改环境变量:

一、环境变量概念
1.1 为什么需要环境变量?
想象这样一个场景:你在寄快递时不需要每次都手动填写快递公司的地址,因为整个城市已经建立了完善的物流网络。环境变量在计算机系统中扮演着类似的角色——为程序运行提供标准化路径指引。
当我们编译C/C++程序时,从来不知道所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器找到标准库的位置。
1.2 环境变量的本质特征
| 特性 | 说明 |
|---|---|
| 全局性 | 对当前用户的所有进程生效 |
| 持久性 | 可通过配置文件永久保存 |
| 继承性 | 子进程自动继承父进程环境变量 |
| 动态性 | 运行时可以即时修改 |
二、环境变量PATH
2.1 PATH的运作机制
系统中,针对于指令的搜索,Linux系统会提供一个搜索指令的环境变量(PATH)。当我们在终端输入命令时,系统会按照PATH指定的路径顺序查找可执行文件。
echo $PATH //查看环境变量中的内容
# 查看当前PATH设置
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
其中,多个路径按冒号:分隔,在Linux执行指令时,会依次在路径中搜索某条指令。

例如ls指令,在系统搜索到 usr/bin 路径时,就找到了ls指令,遂执行。
- /usr/local/sbin/ls ❌
- /usr/local/bin/ls ❌
- /usr/sbin/ls ❌
- /usr/bin/ls ✅
而code可执行文件并不在当前系统默认指令搜索路径PATH中,因此无法执行。

我们可以使用以下语句,将自己的可执行文件执行路径添加到PATH中,这样就可以像使用ls指令一样使用可执行文件命令了。
export PATH=$PATH:[可执行文件路径]

2.2 常见环境变量及其作用
| 项目 | 用途说明 | 示例值 |
|---|---|---|
| PATH | 可执行文件搜索路径 | /usr/bin:/bin |
| HOME | 当前用户主目录 | /home/user |
| SHELL | 默认Shell程序路径 | /bin/bash |
| USER | 当前登录用户名 | alice |
2.3 环境变量操作指南
$ env //查看所有环境变量
$ echo $HOME //查看单个变量

除此之外,我们也可以通过c语言程序获取当前环境变量信息,需要用到系统调用函数getenv()。
#include <stdio.h>
#include <stdlib.h>
int main()
{//获取PATH环境变量printf("PATH = %s\n",getenv("PATH"));printf("who = %s\n",getenv("USER"));return 0;
}

在USER环境变量中,随着我们切换用户(切到root),USER的值也随着发生变化,这表明了环境变量具备了识别用户的能力。
自定义环境变量:
# 临时设置
$ export MY_VAR="hello"# 永久设置(用户级)
$ echo 'export MY_VAR="hello"' >> ~/.bashrc# 永久设置(系统级)
$ sudo sh -c 'echo "MY_VAR=hello" >> /etc/environment'#取消环境变量
$ unset MY_VALUE
三、再谈环境变量
3.1main函数命令行参数解析
命令行参数是用户在命令行中输入命令时,所附带的额外信息。它们可以提供给命令的不同选项、标志或参数值,以改变命令的行为或输出。
用来完成指令的解析工作,使命令具有不同的功能。
main函数的三个参数:参数个数、一张命令行参数表、一张环境变量表
int main(int argc, char *argv[], char *env[]) {// argc: 参数个数// argv: 命令行参数数组// env: 环境变量数组
}
命令行参数表:根据不同命令行输入执行不同的内容;
环境变量表:当前的环境变量信息,其内容与env一致
3.2 环境变量的继承机制
我们执行可执行文件main时,系统会先传入两张向量表,代表了需要执行的操作与继承父进程的环境变量信息!
我们所运行的进程都是子进程,bash启动的时候,会从操作系统的配置文件中读取环境变量信息。而子进程会继承父进程的所有环境变量(向量表方式),换句话来说,bash命令下的所有子进程的环境变量信息一致,因此环境变量具有全局属性。
+----------------+
| 登录Shell |
| PATH=/usr/bin |
+----------------+|| fork()v
+----------------+
| 用户进程 | (继承PATH)
| PATH=/usr/bin |
+----------------+|| execve()v
+----------------+
| 新程序 | (可修改自己的环境变量)
| PATH=/custom |
+----------------+
3.3 本地变量与内部构建命令
| 类型 | 作用域 | 生命周期 | 子进程可见性 |
|---|---|---|---|
| 环境变量 | 全局 | 会话持续 | 可见 |
| 本地变量 | 当前Shell | 会话持续 | 不可见 |
本地变量
所谓本地变量,就是可以直接在命令行定义的变量,显然这样创建的变量并不在环境变量中。本地变量只会在本bash内有效,而不会被子进程集成。

使用set指令用来查看当前系统中的所有本地变量和环境变量。
为何子进程无法继承本地变量,echo同样也会创建子进程继承环境变量,为何与程序不同的是echo可以访问到本地变量MY_VALUE呢?
内部构建命令:
常规命令通过创建子进程完成,内建命令是Shell解释器的原生组成部分,它们不需要创建子进程,而是直接由Shell自身执行,类似与bash调用了自己写的或是系统提供的函数。以上说明,echo是由bash亲自执行的,同样的情况还有cd指令。
总结
掌握环境变量的正确使用方式,将显著提升开发效率和系统管理能力。建议读者通过man environ命令深入学习相关机制,并在实践中不断探索环境变量的高级用法。
👍 感谢各位大佬观看。如果本文有帮助,请点赞收藏支持~
相关文章:
【Linux】从开发到系统管理深入理解环境变量
文章目录 前言一、环境变量概念1.1 为什么需要环境变量?1.2 环境变量的本质特征 二、环境变量PATH2.1 PATH的运作机制2.2 常见环境变量及其作用2.3 环境变量操作指南 三、再谈环境变量3.1main函数命令行参数解析3.2 环境变量的继承机制3.3 本地变量与内部构建命令 总…...
C++相关
1.定义pos时最好用无符号整型 如uint8_t size_t 编译器可能会有(有符号/无符号不匹配)的警告 总的来说就是符号一致 2.遇到俩个lambda相互调用的情况 使用std:funtion前置声明 3.回顾了虚函数,定义virtual 就是虚函数 一般是父类指针指向子…...
智算中心系统化建设与运营框架
智算中心系统化建设与运营框架 围绕智算中心全生命周期,从政策驱动到技术落地构建完整解决方案: 一、政策与产业生态 政策支撑体系 算力补贴机制: 国家层面:工信部“东数西算”工程对西部智算中心给予电价优惠(0.3元/…...
空气质量查询API:助力健康生活与环境监测的智能工具
引言 随着工业化和城市化的快速发展,空气质量问题日益受到人们的关注。空气质量不仅影响我们的日常生活,还直接关系到我们的健康。因此,了解空气质量指数(AQI)以及各项污染物的浓度,对于保障人们的健康至关…...
【CGE】社会核算矩阵构建(一):SAM基本结构
【CGE】社会核算矩阵构建(一):SAM基本结构 社会核算矩阵构建(一):SAM基本结构一、SAM的概念和基本特点二、SAM的基本结构1.开放经济体的SAM表结构2.SAM表各账户的主要核算内容(1)社会…...
Ubuntu 系统部署 Ollama + DeepSeek + Docker + Ragflow
🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 Mysql数据库规范 一、Ol…...
深入探究 JVM 堆的垃圾回收机制(二)— 回收
GC Roots 枚举需要遍历整个应用程序的上下文,而在进行可达性分析或者垃圾回收时,如果我们还是进行全堆扫描及收集,那么会非常耗时。JVM 将堆分为新生代及老生代,它们的回收频率及算法不一样。 1 回收算法 在进行可达性分析时&am…...
第三讲 | C/C++内存管理完全手册
C/C内存管理 一、 C/C内存分布二、 C语言中动态内存管理方式:malloc/calloc/realloc/free三、 C内存管理方式1. new/delete操作内置类型2. new和delete操作自定义类型 四、operator new和operator delete函数(重点)五、new和delete的实现原理…...
2021年蓝桥杯第十二届CC++大学B组真题及代码
目录 1A:空间(填空5分_单位转换) 2B:卡片(填空5分_模拟) 3C:直线(填空10分_数学排序) 4D:货物摆放(填空10分_质因数) 5E…...
秒杀业务优化之从分布式锁到基于消息队列的异步秒杀
一、业务场景介绍 优惠券、门票等限时抢购常常出现在各类应用中,这样的业务一般为了引流宣传而降低利润,所以一旦出现问题将造成较大损失,那么在业务中就要求我们对这类型商品严格限时、限量、每位用户限一次、准确无误的创建订单,…...
IntelliJ IDEA 将 Spring Boot 项目远程部署到服务器
使用 IntelliJ IDEA 将 Spring Boot 项目远程部署到服务器的详细步骤,涵盖多种常见方法: 方法一:通过 SSH Maven 插件直接部署 1. 服务器环境准备 确保服务器已安装: Java 运行环境(与项目 JDK 版本一致࿰…...
Qt 重入和线程安全
重入和线程安全 在整个文档中,"重入"和 "线程安全 "这两个术语被用来标记类和函数,以表明它们在多线程应用程序中的使用方式: 线程安全函数可以同时被多个线程调用,即使调用使用的是共享数据,因…...
23种设计模式中的策略模式
在策略模式定义了一系列算法或策略,并将每个算法封装在独立的类中,使得它们可以互相替换。通过使用策略模式,可以在运行时根据需要选择不同的算法,而不需要修改客户端代码。 策略模式:Strategy。指的是,定义…...
纯vue手写流程组件
前言 网上有很多的vue的流程组件,但是本人不喜欢很多冗余的代码,喜欢动手敲代码;刚开始写的时候,确实没法下笔,最后一层一层剥离,总算实现了;大家可以参考我写的代码,可以拿过去定制…...
WPS宏开发手册——使用、工程、模块介绍
目录 系列文章前言1、开始1.1、宏编辑器使用步骤1.2、工程1.3、工程 系列文章 使用、工程、模块介绍 JSA语法 第三篇练习练习题,持续更新中… 前言 如果你是开发人员,那么wps宏开发对你来说手拿把切。反之还挺吃力,需要嘻嘻…...
面试中如何回答性能优化的问题
性能问题和Bug不同,后者的分析和解决思路更清晰,很多时候从应用日志(文中的应用指分布式服务下的单个节点)即可直接找到问题根源,而性能问题,其排查思路更为复杂一些。 对应用进行性能优化,是一个系统性的工程,对工程师的技术广度和技术深度都有所要求。一个简单的应用…...
django入门教程之request和reponse【二】
接上节:入门【一】 再创建一个orders子应用,python manager.py startapp orders,orders目录中新建一个urls.py文件。结构如图: 通过上节课,我们知道在views.py文件中编写函数时,有一个默认入参request&…...
解决 IntelliJ IDEA 方法断点导致程序无法运行的问题
前言 在日常开发中,调试是程序员不可或缺的工具之一。IntelliJ IDEA 作为一款功能强大的集成开发环境(IDE),提供了丰富的调试功能,例如设置断点、单步执行、变量监视等。然而,有时候我们在调试过程中会遇到…...
RAG优化:python从零实现[吃一堑长一智]循环反馈Feedback
本文将介绍一种有反馈循环机制的RAG系统,让当AI学会"吃一堑长一智",给传统RAG装了个"后悔"系统,让AI能记住哪些回答被用户点赞/拍砖,从此告别金鱼记忆: 每次回答都像在玩roguelike:失败结局会强化下次冒险悄悄把优质问答变成新知识卡牌,实现"以…...
日常学习开发记录-select组件(2)
日常学习开发记录-select组件(2) 第二阶段:增强功能 给现有select组件新增功能 第二阶段:增强功能 键盘操作支持 支持键盘上下箭头选择选项支持回车键确认选择支持Esc键关闭下拉菜单 <template><div:class"[my-s…...
微服务 - 高级篇
微服务 - 高级篇 一、服务治理(一)服务注册与发现(二)负载均衡(三)服务熔断与降级 二、分布式事务(一)解决方案(二)最终一致性 三、性能优化(一&a…...
服务器入门笔记
服务器 采用linux操作系统 SN号 服务器的唯一标识 1U的服务器的高度——4.445cm 服务器上UID灯用于定位服务器 服务器是计算机的一种。在网络中为其他客户机提供计算或者应用服务。 服务器用来响应终端的服务请求,并进行处理 服务器的分类—— 按物理形态&#…...
【Linux】VMware17 安装 Ubuntu24.04 虚拟机
目录 安装教程 一、下载 Ubuntu 桌面版iso映像 二、安装 VMware 三、安装 Ubuntu 桌面版 VMware 创建虚拟机 挂载 Ubuntu ISO 安装 Ubuntu 系统 安装教程 一、下载 Ubuntu 桌面版iso映像 链接来自 清华大学开源软件镜像站 ISO文件地址:ubuntu-24.04.2-des…...
WPS宏开发手册——JSA语法
目录 系列文章2、JSA语法2.1、打印输出2.2、注释2.3、变量2.4、数据类型2.5、函数2.6、运算符2.7、比较2.8、if else条件语句2.9、for循环2.10、Math对象(数字常用方法)2.11、字符串常用方法2.12、数组常用方法 系列文章 使用、工程、模块介绍 JSA语…...
word中指定页面开始添加页码
第一步: 插入页码 第二步: 把光标放到指定起始页码处 第三步: 取消链接到前一节 此时关掉页脚先添加分节符 添加完分节符后恢复点击 第四步: 设置页码格式,从1开始 第五步: 删掉不要的页码,…...
详解“二分”系列算法
前言 1.学习建议 网上教二分系列算法的视频或者文章不在少数,每个人对于二分算法的理解都是不一样的,作者不建议小白刚学习二分系列算法就看很多不同的视频或者博客去学习,举个例子,有些教学提供的方法会把left赋值为-1…...
Python实现deepseek接口的调用
简介:DeepSeek 是一个强大的大语言模型,提供 API 接口供开发者调用。在 Python 中,可以使用 requests 或 httpx 库向 DeepSeek API 发送请求,实现文本生成、代码补全,知识问答等功能。本文将介绍如何在 Python 中调用 …...
文档处理控件Aspose.Words 教程:.NET版中增强的 AI 文档摘要功能
Aspose.Words是一个功能强大的 Word 文档处理库。它可以帮助开发人员自动编辑、转换和处理文档。 自 24.11 版以来,Aspose.Words for .NET 提供了 AI 驱动的文档摘要功能,使用户能够从冗长的文本中快速提取关键见解。在 25.2 版中,我们通过使…...
【Linux 维测专栏 5 -- linux pstore 使用介绍】
文章目录 Linux pstore 功能简介1. pstore 概述2. pstore 的核心功能3. pstore 的工作原理4. pstore 的使用示例5. pstore 的优势6. 典型应用场景配置示例1)DTS配置2)config配置运行测试及log问题小结Linux pstore 功能简介 1. pstore 概述 pstore(Persistent Storage)是…...
19,C++——11
目录 一、 C11简介 二、 新增的列表初始化 三、 新增的STL容器 四、 简化声明 1,auto 2,decltype 3,nullptr 五、右值引用 1,左值引用和右值引用 2,两种引用的比较 3,左值引用的使用场景 4&…...
