【Linux】从开发到系统管理深入理解环境变量

news2025/3/25 22:33:00

文章目录

  • 前言
  • 一、环境变量概念
    • 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命令深入学习相关机制,并在实践中不断探索环境变量的高级用法。

👍 ​感谢各位大佬观看。如果本文有帮助,请点赞收藏支持~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2321579.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【CGE】社会核算矩阵构建(一):SAM基本结构

【CGE】社会核算矩阵构建&#xff08;一&#xff09;&#xff1a;SAM基本结构 社会核算矩阵构建&#xff08;一&#xff09;&#xff1a;SAM基本结构一、SAM的概念和基本特点二、SAM的基本结构1.开放经济体的SAM表结构2.SAM表各账户的主要核算内容&#xff08;1&#xff09;社会…

Ubuntu 系统部署 Ollama + DeepSeek + Docker + Ragflow

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; Mysql数据库规范 一、Ol…

第三讲 | C/C++内存管理完全手册

C/C内存管理 一、 C/C内存分布二、 C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free三、 C内存管理方式1. new/delete操作内置类型2. new和delete操作自定义类型 四、operator new和operator delete函数&#xff08;重点&#xff09;五、new和delete的实现原理…

2021年蓝桥杯第十二届CC++大学B组真题及代码

目录 1A&#xff1a;空间&#xff08;填空5分_单位转换&#xff09; 2B&#xff1a;卡片&#xff08;填空5分_模拟&#xff09; 3C&#xff1a;直线&#xff08;填空10分_数学排序&#xff09; 4D&#xff1a;货物摆放&#xff08;填空10分_质因数&#xff09; 5E&#xf…

秒杀业务优化之从分布式锁到基于消息队列的异步秒杀

一、业务场景介绍 优惠券、门票等限时抢购常常出现在各类应用中&#xff0c;这样的业务一般为了引流宣传而降低利润&#xff0c;所以一旦出现问题将造成较大损失&#xff0c;那么在业务中就要求我们对这类型商品严格限时、限量、每位用户限一次、准确无误的创建订单&#xff0c…

纯vue手写流程组件

前言 网上有很多的vue的流程组件&#xff0c;但是本人不喜欢很多冗余的代码&#xff0c;喜欢动手敲代码&#xff1b;刚开始写的时候&#xff0c;确实没法下笔&#xff0c;最后一层一层剥离&#xff0c;总算实现了&#xff1b;大家可以参考我写的代码&#xff0c;可以拿过去定制…

WPS宏开发手册——使用、工程、模块介绍

目录 系列文章前言1、开始1.1、宏编辑器使用步骤1.2、工程1.3、工程 系列文章 使用、工程、模块介绍 JSA语法 第三篇练习练习题&#xff0c;持续更新中… 前言 如果你是开发人员&#xff0c;那么wps宏开发对你来说手拿把切。反之还挺吃力&#xff0c;需要嘻嘻&#xf…

django入门教程之request和reponse【二】

接上节&#xff1a;入门【一】 再创建一个orders子应用&#xff0c;python manager.py startapp orders&#xff0c;orders目录中新建一个urls.py文件。结构如图&#xff1a; 通过上节课&#xff0c;我们知道在views.py文件中编写函数时&#xff0c;有一个默认入参request&…

RAG优化:python从零实现[吃一堑长一智]循环反馈Feedback

本文将介绍一种有反馈循环机制的RAG系统,让当AI学会"吃一堑长一智",给传统RAG装了个"后悔"系统,让AI能记住哪些回答被用户点赞/拍砖,从此告别金鱼记忆: 每次回答都像在玩roguelike:失败结局会强化下次冒险悄悄把优质问答变成新知识卡牌,实现"以…

【Linux】VMware17 安装 Ubuntu24.04 虚拟机

目录 安装教程 一、下载 Ubuntu 桌面版iso映像 二、安装 VMware 三、安装 Ubuntu 桌面版 VMware 创建虚拟机 挂载 Ubuntu ISO 安装 Ubuntu 系统 安装教程 一、下载 Ubuntu 桌面版iso映像 链接来自 清华大学开源软件镜像站 ISO文件地址&#xff1a;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对象&#xff08;数字常用方法&#xff09;2.11、字符串常用方法2.12、数组常用方法 系列文章 使用、工程、模块介绍 JSA语…

word中指定页面开始添加页码

第一步&#xff1a; 插入页码 第二步&#xff1a; 把光标放到指定起始页码处 第三步&#xff1a; 取消链接到前一节 此时关掉页脚先添加分节符 添加完分节符后恢复点击 第四步&#xff1a; 设置页码格式&#xff0c;从1开始 第五步&#xff1a; 删掉不要的页码&#xff0c…

Python实现deepseek接口的调用

简介&#xff1a;DeepSeek 是一个强大的大语言模型&#xff0c;提供 API 接口供开发者调用。在 Python 中&#xff0c;可以使用 requests 或 httpx 库向 DeepSeek API 发送请求&#xff0c;实现文本生成、代码补全&#xff0c;知识问答等功能。本文将介绍如何在 Python 中调用 …

文档处理控件Aspose.Words 教程:.NET版中增强的 AI 文档摘要功能

Aspose.Words是一个功能强大的 Word 文档处理库。它可以帮助开发人员自动编辑、转换和处理文档。 自 24.11 版以来&#xff0c;Aspose.Words for .NET 提供了 AI 驱动的文档摘要功能&#xff0c;使用户能够从冗长的文本中快速提取关键见解。在 25.2 版中&#xff0c;我们通过使…

19,C++——11

目录 一、 C11简介 二、 新增的列表初始化 三、 新增的STL容器 四、 简化声明 1&#xff0c;auto 2&#xff0c;decltype 3&#xff0c;nullptr 五、右值引用 1&#xff0c;左值引用和右值引用 2&#xff0c;两种引用的比较 3&#xff0c;左值引用的使用场景 4&…

风尚云网|前端|前后端分离架构深度剖析:技术革新还是过度设计?

前后端分离架构深度剖析&#xff1a;技术革新还是过度设计&#xff1f; 作者&#xff1a;风尚云网 在数字化转型浪潮中&#xff0c;前后端分离架构已成为现代Web开发的主流模式。但这项技术真的是银弹吗&#xff1f;本文将从工程实践角度&#xff0c;剖析其优势与潜在风险&am…

CMS网站模板设计与用户定制化实战评测

内容概要 在数字化转型背景下&#xff0c;CMS平台作为企业内容管理的核心载体&#xff0c;其模板架构的灵活性与用户定制能力直接影响运营效率。通过对WordPress、Baklib等主流系统的技术解构发现&#xff0c;模块化设计理念已成为行业基准——WordPress依托超过6万款主题库实…

搭建个人博客教程(Hexo)

如何快速搭建一套本地的博客系统呢&#xff1f;这里有一套gitNode.jsHexo的部署方案来进行解决。 安装git Git 是一款免费开源的分布式版本控制系统&#xff0c;由 Linus Torvalds 于 2005 年为 Linux 内核开发设计。它通过本地仓库和远程仓库实现代码管理&#xff0c;支持分支…

Docker 可视化工具 Portainer

Docker 可视化工具 Portainer安装 官方安装地址&#xff1a;https://docs.portainer.io/start/install-ce/server/docker/wsl 一&#xff0c;首先&#xff0c;创建 Portainer Server 用来存储数据库的卷&#xff1a; docker volume create portainer_data二&#xff0c;然后…

数据库基础知识点(系列二)

1&#xff0e;关系数据模型由哪三个要素组成。 答&#xff1a;关系数据模型由关系数据结构、关系操作集合和关系完整性约束三部分组成。 2&#xff0e;简述关系的性质。&#xff08;关系就是一张二维表格&#xff0c;但不是任何二维表都叫关系&#xff09; 答&#xff1a;(1…