【Linux系统】09 环境变量
前言前面我们学习了进程、PCB、fork、进程状态、进程切换我们知道 fork 创建子进程时子进程会拷贝父进程的 PCB 与相关资源。 在 Linux 中执行ls、pwd、whoami这类命令我们不需要输入完整路径/bin/ls直接敲命令名就可以运行程序这个能力的底层支撑就是环境变量。环境变量是一组以keyvalue形式组织的全局字符串存放在进程的环境表中属于进程上下文的一部分。环境变量的核心特性父进程的环境变量fork 创建子进程时会被子进程继承。环境变量的组织方式每个程序都会收到⼀张环境表环境表是⼀个字符指针数组每个指针指向⼀个以’\0’结尾的环境字符串局部变量不会被子进程继承环境变量可以被子进程继承这是二者最核心区别。一、变量分类本地变量 vs 环境变量1. 本地变量自定义局部变量在当前 bash 终端内定义仅在当前 shell 进程内部生效。fork 创建的子进程无法读取这个变量终端关闭变量直接销毁。# 定义本地变量 local_val我是本地变量 # 查看变量 echo $local_val新开子 shell 测试bash # 创建子shell echo $local_val # 无输出子进程拿不到本地变量 exit # 退出子shell2. 环境变量全局变量环境变量存放在进程的环境表中当父进程 fork 生成子进程子进程会拷贝父进程完整环境表子进程可以读取父进程的环境变量。 使用export可以把本地变量提升为环境变量。# 方式1定义同时导出为环境变量 export env_val我是环境变量 # 方式2先定义本地变量再导出 test_val100 export test_val子 shell 测试bash echo $env_val # 输出 我是环境变量子进程继承成功 exit二、查看环境变量的常用命令1. env直接打印所有环境变量只会输出环境变量不会输出 shell 本地变量。env2. echo $ 变量名查看单个环境变量$符号代表取变量的值echo $PATH echo $HOME echo $USER echo $SHELL echo $PWD3. set输出本地变量 环境变量输出范围比 env 更大。4. export不带参数执行 export列出所有环境变量效果近似 env。5. unset 删除变量无论是本地变量还是环境变量都可以使用 unset 删除。unset env_val三、Linux 系统内置常用环境变量详解表格环境变量作用说明PATH最重要可执行程序搜索路径。直接输入程序名系统按 PATH 内目录顺序查找可执行文件目录之间用冒号:分隔HOME当前登录用户的家目录。不带参数执行cd默认直接回到 $HOMEUSER当前登录的用户名SHELL当前使用的命令解释器一般是/bin/bashPWD当前所在工作目录pwd命令本质就是读取这个环境变量LOGNAME登录用户名和 USER 含义相近LD_LIBRARY_PATH动态库搜索路径程序运行时优先从该目录寻找动态库LANG系统语言字符集控制终端中文 / 英文输出重点深入理解 PATHPATH 的值是多个目录使用:隔开示例PATH/usr/local/bin:/usr/bin:/bin执行ls时操作系统的查找逻辑依次遍历 PATH 里面的目录先去第一个目录/usr/local/bin寻找名为 ls 的可执行文件找到就直接执行停止搜索找不到就继续去下一个目录查找全部目录查找完毕仍然找不到提示command not found。小实验自己写 C 程序编译生成 a.out默认执行必须./a.out。 如果把当前目录加入 PATH就可以直接输入 a.out 运行export PATH$PATH:.$PATH代表保留原来 PATH 所有内容.代表当前目录。 ⚠️ 安全提醒不要长期把.放在 PATH 最前面存在恶意程序安全隐患。四、临时环境变量与永久环境变量4.1 临时修改环境变量使用 export 命令直接在终端修改仅当前 bash 进程以及它 fork 出来的子进程生效关闭终端之后修改全部失效。上面所有 export 示例都是临时修改。4.2 永久修改环境变量修改配置文件每次登录 shell 自动加载配置永久生效。分为用户级别和系统级别。用户级别只对当前登录用户生效推荐使用 配置文件~/.bashrc、~/.bash_profilevim ~/.bashrc # 在文件末尾添加这一行 export MY_ENV永久环境变量测试保存退出文件后执行 source 加载配置不需要重新登录终端source ~/.bashrcsource 原理在当前 shell 进程执行脚本不会创建子 shell。 如果直接执行./.bashrc会新建子 shell 运行脚本环境变量只在子 shell 生效父终端不会生效。系统级别所有登录用户都会生效需要 root 权限 配置文件/etc/profile修改后所有用户登录都会加载这个环境变量。修改系统级配置需要谨慎。五、C 语言代码中获取环境变量环境变量以字符串数组形式保存数组每一项是keyvalue数组最后一项是 NULL 标记结束。 C 语言有三种方式获取环境变量。方式 1main 函数第三个参数 envmain 完整原型int main(int argc, char* argv[], char* env[]);env 就是环境变量字符串数组。#include stdio.h int main(int argc, char* argv[], char* env[]) { //遍历打印全部环境变量 for(int i 0; env[i]; i) { printf(%s\n, env[i]); } return 0; }编译运行输出结果等价于env命令。方式 2库函数 getenv工程推荐写法头文件#include stdlib.h函数原型char *getenv(const char *name);传入环境变量名称字符串返回对应 value 指针环境变量不存在返回 NULL。 优点不需要遍历全部环境变量直接按名字查找代码可读性高。#include stdio.h #include stdlib.h int main() { char* path_val getenv(PATH); if(path_val ! NULL) { printf(PATH %s\n, path_val); } return 0; }方式 3全局外部变量 environ系统提供全局变量environ类型char**代表环境变量数组不需要 main 传参也可以使用。#include stdio.h extern char** environ; int main() { for(int i 0; environ[i]; i) { printf(%s\n, environ[i]); } return 0; }面试考点三种获取方式对比工程开发优先使用 getenv。六、fork 父子进程环境变量继承规则【核心重点】父进程执行 export 设置环境变量之后再 fork 创建子进程子进程会拷贝一份父进程环境表子进程可以继承环境变量。子进程修改自己的环境变量不会影响父进程。fork 采用写时拷贝父子进程地址空间相互独立。子进程创建完成之后父进程后续新增 / 修改环境变量已经存在的子进程不会感知到父进程的变化。本地变量不会被子进程继承只有 export 导出后的环境变量才会被子进程继承。验证实验# 定义本地变量 var_local100 # 导出环境变量 export var_env200 # 创建子shell bash echo $var_local # 无输出本地变量无法继承 echo $var_env # 输出200环境变量继承成功 exit七、source 命令详解面试高频source 脚本名 # 简写 . 点 . 脚本名普通执行脚本./test.sh会创建子 shell 进程执行脚本脚本内部 export 的环境变量只在子 shell 生效脚本执行结束子进程销毁父 shell 完全不受影响。source 执行脚本不会创建新进程直接在当前 shell 进程执行脚本代码。脚本里定义的环境变量直接作用在当前终端。所以修改.bashrc之后要用 source 生效而不是直接运行文件。八、面试高频问答Q1本地变量和环境变量的区别本地变量仅当前 shell 进程可见fork 子进程无法继承环境变量保存在进程环境表fork 子进程会拷贝环境表子进程可以继承环境变量。Q2环境变量什么时候被子进程继承必须是父进程已经 export 导出环境变量然后再 fork 创建子进程子进程才能拿到。子进程创建完成之后父进程新增环境变量子进程看不到。Q3command not found 报错有哪些原因命令 / 可执行文件本身不存在可执行文件存在但是文件所在目录不在 PATH 环境变量的搜索目录中文件存在但是当前用户没有可执行权限。 解决办法使用绝对路径执行或者把目录添加到 PATH。Q4source 和直接执行脚本 ./xxx.sh 的区别./xxx.sh新建子 shell 运行脚本脚本内环境变量只在子进程生效父 shell 不受影响。source xxx.sh当前 shell 进程直接执行脚本不创建子进程脚本中修改的环境变量直接作用于当前终端。Q5子进程修改环境变量会影响父进程吗不会。fork 之后发生写时拷贝父子进程环境表相互独立子进程修改属于自己的副本不会影响父进程。九、小结环境变量是以keyvalue存储在进程环境表中的字符串是进程上下文的组成部分核心特点是 fork 创建子进程时可以被子进程继承。 PATH 是日常开发最常用的环境变量控制系统去哪里寻找可执行程序。 我们既可以在 shell 命令行操作环境变量也可以在 C 代码中读取环境变量。区分临时生效、永久生效理解父子进程环境变量继承规则是本章核心。

相关新闻

ChatGPT Deep Research 入门:把复杂问题做成带出处的调研报告

ChatGPT Deep Research 入门:把复杂问题做成带出处的调研报告

适合人群:写竞品分析、行业功课、选题调研时,需要“多来源综合 带出处”的同学;已经会用 ChatGPT 普通搜索或网页浏览,但觉得结果太碎、不够成篇。Deep Research 的额度、入口与地区可用性因计划而异,请看产品内用量提…

2026/10/15 4:09:46 阅读更多 →
【AIGC实战】手绘线稿变国潮IP:英歌舞与芒果的跨界融合,附Python批量重命名脚本与商用思路

【AIGC实战】手绘线稿变国潮IP:英歌舞与芒果的跨界融合,附Python批量重命名脚本与商用思路

大家好,我是“AI国潮设计-小江”。这是《潮汕甜品宇宙》系列的最新作品——【英歌舞金芒】。很多朋友问我:“小江,你生成的图这么精致,如果我要给一家店做全套菜单,怎么才能保证风格统一?难道一张张抽卡吗&…

2026/10/15 4:09:46 阅读更多 →
每日热门skill-别再看录播课了!清华把「AI 老师 + AI 同学」的课堂开源了:一句话生成一门课,29.6K Star 的 OpenMAIC 深度拆解

每日热门skill-别再看录播课了!清华把「AI 老师 + AI 同学」的课堂开源了:一句话生成一门课,29.6K Star 的 OpenMAIC 深度拆解

免费基金定投助手全功能拆解:为什么你的基金定投还在亏钱?因为你的工具用错了。动态平衡仓位管理8种智能定投策略引擎,会自己算买卖点的定投系统-CSDN博客 https://download.csdn.net/download/weitingfu/93448039?spm1001.2014.3001.5503 你…

2026/10/15 4:08:46 阅读更多 →

最新新闻

火山引擎智能数据洞察平台v2.0工程实践深度解析

火山引擎智能数据洞察平台v2.0工程实践深度解析

简介:本资源是火山引擎官方发布的《智能数据洞察平台v2.0》核心介绍PPT,面向企业数据平台建设者、BI工程师、数据分析负责人及数字化转型决策者,系统解析该平台在跨源融合、自助建模、AI增强分析与嵌入式BI等关键场景下的技术架构与落地能力。…

2026/10/15 4:59:06 阅读更多 →
基于SpringBoot+Vue的校园体育资源共享与运动爱好者交流平台设计与实现

基于SpringBoot+Vue的校园体育资源共享与运动爱好者交流平台设计与实现

选题背景与意义 随着我国高等教育事业的持续发展和“健康中国”战略的深入推进,高校体育教育逐渐从传统的课堂教学模式向多元化、个性化、信息化方向转型。校园体育资源作为高校育人体系的重要组成部分,不仅承载着增强学生体质、培养健康生活方式的功能&…

2026/10/15 4:59:06 阅读更多 →
金融方面的证书有哪些含金量高的?按岗位分赛道的选择思路

金融方面的证书有哪些含金量高的?按岗位分赛道的选择思路

金融领域的证书很多,宣传口径也很杂。有人把从业资格和CFA放在一张表里比,有人把培训结业证说成"国家认可",还有人暗示考下某个证就能进投行。这些说法往往忽略了一个前提:证书的含金量,取决于它本身的制度性…

2026/10/15 4:59:06 阅读更多 →
剑侠世界4:无限定档10.15公测!开服福利奖励攻略

剑侠世界4:无限定档10.15公测!开服福利奖励攻略

剑侠世界4:无限于10月15日全平台公测,预下载也已经正式开启。10 月 14 日 10 点起全平台开放预下载,同步开启服务器预创角。PC 端玩家预创角成功后,还能进入独立试玩场景,提前熟悉各武器的技能手感和外观效果。要注意首…

2026/10/15 4:59:06 阅读更多 →
xtu C语言基础-试除法判断素数

xtu C语言基础-试除法判断素数

//试除法判断素数 int is_prime(int n){if(n<2) return 0; if(n2) return 1;if(n%20) return 0; //除2以外所有偶数都不是素数//排除了偶数之后只用遍历奇数for(int i3;i*i<n;i2){ //i*i可以避免浮点数运算if(n%i0) return 0;}return 1; }

2026/10/15 4:59:06 阅读更多 →
静态路由实现全网可达:从路由表原理到配置与排错

静态路由实现全网可达:从路由表原理到配置与排错

做网络项目最烦的是什么&#xff1f;设备连好线、接口全亮&#xff0c;结果PC之间互相ping不通&#xff0c;而且怎么查都看不出问题。干这行久了你就明白&#xff0c;八成是路由表没配周全——数据包走到中间某台路由器&#xff0c;转发表里没有目标网段&#xff0c;报文直接被…

2026/10/15 4:58:06 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时&#xff0c;网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上&#xff0c;依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里&#xff0c;扩缩容到底难在哪做过大模型推理服务部署的人&#xff0c;大概都经历过这样的场景&#xff1a;一个团队共用一套推理集群&#xff0c;A 业务跑的是 7B 的小模型&#xff0c;B 业务跑的是 72B 的大模型&#xff0c;C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子&#xff1a;一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减&#xff0c;为了把启动时间压进两秒以内&#xff0c;我手贱地把一串自认为“没用”的 systemd 服务给 disable 了&#xff0c;其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介&#xff1a;基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码&#xff0c;面向计算机相关专业课程设计与期末大作业学生&#xff0c;以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程&#xff0c;…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程&#xff1a;键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化&#xff0c;十个新手有八个栽在"往输入框里填东西"这件事上&#xff1a;要么填不进去&#xff0c;要么填了一半&#xff0c;要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程&#xff1a;阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀&#xff1a;什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面&#xff0c;跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →