当前位置: 首页 > news >正文

Linux之进程(六)--环境变量

了解main的参数

我们直接来看一下这个函数

我们可以合理推测这个argc是记录命令行参数的的个数多少,而argv[]记录命令行的具体命令

我们来做一个小demo初步实现linux的命令行,留个印象

我们来思考一下为什么要有命令行参数

命令行参数本质上是为了实现一个命令,根据不同的子选项,来实现不同的子命令

什么是环境变量

环境变量(Environment Variable)​ 是操作系统或运行环境中用来存储系统配置信息、路径、行为开关的一类“全局变量”,可以被系统中的程序直接读取和使用。

从操作理解环境变量

为什么我们按ll可以查看文件夹内的信息,pwd怎么可以看当前的路径

为什么我们要这样./main.c才能运行这个二进制文件

因为系统并不知道二进制的位置,而pwd,ll,cd命令都在user/bin的文件夹下面,系统自动去哪个文件夹下面找可执行二进制文件.就是说

环境变量里记录的那些文件夹,操作系统挨个翻一遍,去找有没有这个名字的可执行文件。
如果找到了:就运行它。
如果找遍了都没找到:就会报错 command not found。它会把 PATH环境变量里记录的那些文件夹,挨个翻一遍,去找有没有这个名字的可执行文件。

其他可执行文件不知道位置,所以要加上文件的位置信息

更改环境变量

现在可以直接运行main.exe文件

但是之前的ls等指令都无法实行了

但是我们退出后会恢复,为了不丢失原来的系统指令,要用下面这种方法,但是下面也是零时的办法

永久写进去

echo 'export PATH=$PATH:/your/dir/here' >> ~/.bashrc
查看环境变量的方法

PATH环境变量:存储命令指令的文件的文件地址

环境变量改变了,原来的命令无法执行了,但是没有关系 ,我们退出在进就欧克

除了上面这种还有其他的环境变量

env可以看到所有的环境变量

user就会记录当前的使用者

pwd就会记录当前文件的所在位置

当然还有其他的,这里不做过多介绍

main的参数查看环境变量

main函数可以有多个参数,第三个是环境变量,为了没有警告我们对前两个参数也要操作.

env是二级指针数组,里面存有环境变量的内容,我们可以像访问数组一样去获取环境变量的地址

使用函数来获取getenv

getenv+你想要的环境变量,就可以获得你所需环境变量的值

环境变量底层传递的原理

子进程继承父进程的环境变量

我们让父进程打印完,在打印子进程

父进程和子进程的环境变量的数目是一样的,环境变量的内容也一致

子进程从父进程那里继承环境变量

当然子进程在fork一个进程,fork出来的进程也可以继承环境变量

子进程从bash那里继承环境变量,那bash里面的环境变量又是从哪里来的呢?

bash 自身的环境变量源头,全部来自系统 / 用户本地配置文件,并非凭空存在;同时能完美解释「临时改 PATH,新开 Xshell 就恢复原样」这个现象

子进程会从父 bash 进程继承内存中的环境变量,而 bash 自身加载的环境变量全部来自 Linux 本地的系统、用户配置文件。每次 bash 实例启动时,都会按固定顺序读取硬盘上的配置文件,将文件中定义的 PATH、自定义变量加载到自身运行上下文。这也能解释我们直接在终端临时修改 PATH 后,重新打开 Xshell 环境变量就恢复默认的现象:命令行执行 export 修改 PATH 只是临时存入当前 bash 进程内存,不会写入硬盘配置文件;关闭当前终端窗口后,该 bash 进程销毁,内存里临时新增的路径直接丢失;新打开的 Xshell 会创建全新 bash 进程,重新读取原始配置文件初始化环境,PATH 自然变回文件内预设的默认值。如果想要配置永久生效,需要将 PATH 追加语句写入~/.bashrc、/etc/profile 等持久化配置文件。

系统级配置(所有用户共用,开机 / 登录时加载)
  1. /etc/profile:登录 Shell 最先读取,定义全用户基础 PATH、系统全局变量;
  2. /etc/profile.d/*.sh/etc/profile会自动批量执行该目录下所有脚本,用于拆分系统环境配置;
  3. /etc/bashrc(CentOS)//etc/bash.bashrc(Ubuntu):全局交互式 shell 配置,所有新开终端都会加载,统一设置提示符、全局别名。

我们来看一下bashrc,bash_profile

这两个文件都是再用户家目录下的隐藏文件

bash_profile

他会读取bashrc的内容

bashrc

他会访问ect下面的bashrc


etc/bashrc

设置全系统所有用户共享的交互配置:

  1. 全局 shell 提示符 PS1、配色
  2. 全局别名 alias(所有用户都能用)
  3. 全局函数
  4. 自动补全、shell 安全设置

那么我们就可以设置一个自己的登录信息提示

了解变量

局部变量

我想要定义一个自己的环境变量

发现找不到我自己定义的环境变量,但是是存在这个变量的

因为这个环境变量还只是本地变量,也就是局部变量,他无法被子进程继承,没有全局性,只可以在bash内部访问

将局部变量转换为转为环境变量(环境变量是全局变量)

我们要用export将他导入环境变量,之后再搜索即可

export TEST=100

环境变量时全局的,子进程可以继承父进程的环境变量,

去除环境变量
unset 环境变量名

查看局部变量和全局变量
set

对比项局部变量环境变量 (export 导出)
定义语法var=xxxexport var=xxx/ 先赋值再 export
子进程继承❌ 不能继承✅ 子进程自动复制一份
C 语言 getenv 读取❌ 读不到✅ 可以读取
查看命令set(仅 shell 本地变量)env/printenv
删除命令unset varunset var(同时从环境表清除)
生命周期当前 shell 会话,关闭消失当前 shell 会话,关闭消失
持久化无法永久保存写入~/.bashrc等配置文件可永久生效
http://www.cnnetsun.cn/news/3273218.html

相关文章:

  • 单 RGB 摄像头实现复杂环境导航!Robostral Navigate 成功率达 76.6%
  • 【LeetCode 手撕算法】(细节知识点总结)
  • 如何构建自进化企业级 Agent 平台
  • 浏览器自动化_agent-browser
  • OpenClaw基础学习
  • 2026年房地产动画行业观察
  • 前端 CDN 缓存策略调优:静态资源、HTML 与 API 分层设计
  • The Impact of Image Resolution on Biomedical Multimodal Large Language Models
  • 【第008篇】通过dexp和dimp命令导出和导入dmp文件(适用于达梦数据库)
  • 香港虚拟资产双轨监管观察:从 MSO 到 VA OTC 的制度演变
  • 三星AI眼镜Galaxy Glasses技术解析:1200万像素摄像头与光致变色镜片的开发实践
  • Claude Code 100个真实案例 - 用AI搭建爬虫数据采集平台(自动翻页+反反爬)
  • 郑州城市职业学院参编清华教材背后的育人突围之路
  • 【Ambari Plus】15.Livy 安装
  • AI 接手一个项目之前,先给它一张可验证的上下文包
  • hive 学习笔记5——hive常用操作(日常短篇练习应用)
  • Claude Code 高级玩法:工作流编排、Token 优化与团队协作
  • M365 Copilot数据访问边界管控实战:基于Microsoft Purview的DSPM落地
  • 专访统丽学子邸斯|勇夺 Nailympia 国际美甲大赛金奖,以指尖艺术奔赴时尚美学之路
  • Python新手最容易踩的10个隐式坑,我刚工作时踩了一半,直接导致线上数据统计出错
  • AI 生图会替代设计师吗?更现实的答案是辅助创意沟通
  • claude code 接入deepseek-v4 pro或者flash模型
  • Python学习小记-类的引用,python下载的依赖管理
  • 【Atlas】 Spark SQL 的执行计划(LogicalPlan/PhysicalPlan)能否被 Atlas 捕获?社区有哪些集成方案?
  • ADP5350与PIC18F85J50嵌入式电源管理方案详解
  • AI 习惯追踪的反馈设计:鼓励不是堆砌赞美,而是记录可见进步
  • 2026年免疫细胞存储行业现状与用户关注方向解析
  • 使用LocalDate和LocalDateTime接收日期时间
  • elasticsearch学习笔记(三十五)——Elasticsearch 索引管理
  • 5分钟打造你的专属知识中心:Obsidian Homepage完全指南