
💗博主介绍:计算机专业的一枚大学生 来自重庆 @燃于AC之乐✌专注于C++技术栈,算法,竞赛领域,技术学习和项目实战✌💗 💗根据博主的学习进度更新(可能不及时) 💗后续更新主要内容:C语言,数据结构,C++、linux(系统编程和网络编程)、MySQL、Redis、QT、Python、Git、爬虫、数据可视化、小程序、AI大模型接入,C++实战项目与学习分享。 👇🏻 精彩专栏 推荐订阅👇🏻 点击进入🌌作者专栏🌌: Linux系统编程✅ 算法画解 ✅ C++ ✅ 🌟算法相关题目点击即可进入实操🌟 感兴趣的可以先收藏起来,请多多支持,还有大家有相关问题都可以给我留言咨询,希望希望共同交流心得,一起进步,你我陪伴,学习路上不孤单!
文章目录
- 📖前言
- 一、基本概念
- 二、常见环境变量
- 🔍三、查看环境变量方法
- 四、环境变量测试
-
- 1.测试PATH
- 2.测试HOME
- 五、环境变量相关的命令
- 六、环境变量的组织方式
- 🎯 七、获取或设置环境变量的方法
-
- 1.通过代码
- 2.通过系统调用getenv()
- 🔧八、环境变量的全局属性
📖前言
在Linux的浩瀚世界里,环境变量犹如一张无形的网络,贯穿于系统的每一个角落。它们不仅仅是简单的键值对,更是连接用户、程序与操作系统的重要桥梁。从PATH指引命令的寻址路径,到HOME定义用户的个人空间;从简单的终端操作到复杂的进程间通信,环境变量在幕后默默发挥着关键作用。本篇博客将带您深入探索Linux环境变量的奥秘,从基本概念到实际应用,从命令行操作到编程实现,全面解析这个看似简单却功能强大的系统特性。无论您是Linux新手还是经验丰富的开发者,相信都能从中获得新的启发与实用的技巧。
一、基本概念
环境变量⼀般是指在操作系统中用来指定操作系统运行环境的⼀些参数。
例如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪 ⾥,但是照样可以链接成功,⽣成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
环境变量通常具有某些特殊⽤途,还有在系统当中通常具有全局特性。
这些参数会被bash使用,间接就会被用户使用。
二、常见环境变量
PATH : 指定命令的搜索路径。
HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)。
SHELL :当前Shell,它的值通常是/bin/bash。
USER: 查看username(使用名),logname(登录名)
HISTSIZE:3000(具体看版本),展示过去3000行命令。
HOSTNAME::主机名。
PWD:当前目录。
OLDPWD:上次目录。
……
🔍三、查看环境变量方法
echo $NAME //NAME:你的环境变量名称

四、环境变量测试
1.测试PATH
#include <stdio.h>
int main()
{
printf("hello linux!\\n");
return 0;
}

因为系统存在环境变量PATH,可以找到封装好的程序指令,而系统是无法找到我们自己的可执行程序的,所以我们必须带上./,以此告诉系统该可执行程序位于当前目录下。
解决方法:
(1)可以将它加入到usr/bin下,但是很不推荐,自己的可能有bug,会污染系统本来的指令池。
sudo cp 文件名 /usr/bin
删除:
sudo rm /usr/bin/文件名
(2)将可执行程序所在的目录导入到环境变量PATH当中。 先pwd找到当前路径,再PATH=$PATH:路径
注意:下次登录就没有了。
2.测试HOME

差异总结:
| 普通用户(zgr) | /home/zgr | 普通用户的家目录在 /home/用户名 下 |
| root用户 | /root | root用户有独立的家目录 /root |
总结: 不同用户的HOME目录不同:普通用户在/home/用户名,root用户在/root ~是简写:在shell中自动扩展为当前用户的HOME目录 ~ = $HOME:两者都指向当前用户的家目录,但~是shell扩展,$HOME是环境变量
五、环境变量相关的命令
echo: 显示某个环境变量值
export: 设置⼀个新的环境变量
env: 显示所有环境变量 
unset: 清除环境变量 
set: 显示本地定义的shell变量和环境变量
六、环境变量的组织方式
用户进入后,自动创建bash进程,bash会得到环境变量表,字符串指针数组,当有命令,如:ls-a,它会解析到命令行参数表给bash,bash又会通过path查环境变量表,进而找到它并执行。
每个程序都会收到⼀张环境表,环境表是⼀个字符指针数组,每个指针指向⼀个以’\\0’结尾的环境字符串。
结论:执行一个命令之前,bash通过命令行参数表和环境变量表,PATH,找到它。
🎯 七、获取或设置环境变量的方法
1.通过代码
#include <stdio.h>
int main(int argc, char *argv[], char *env[])
{
int i = 0;
for(; env[i]; i++){
printf("%s\\n", env[i]);
}
return 0;
}
argc:命令行参数个数
argv[]:命令行参数数组
env[]:环境变量数组,以NULL结尾
这是C语言标准中定义的方式,环境变量作为main函数的第三个参数传入。
#include <stdio.h>
int main(int argc, char *argv[])
{
extern char **environ;
int i = 0;
for(; environ[i]; i++){
printf("%s\\n", environ[i]);
}
return 0;
}
environ是libc库中定义的全局变量
它指向环境变量表的起始地址
需要extern声明,因为它不在任何标准头文件中定义
特点:
1.比使用main函数参数更灵活
2.可以在程序的任何地方访问
3.是POSIX标准的一部分
2.通过系统调用getenv()
#include <stdio.h>
#include <stdlib.h> // 包含getenv()函数的头文件
int main()
{
// 获取特定的环境变量
printf("PATH: %s\\n", getenv("PATH"));
printf("HOME: %s\\n", getenv("HOME"));
printf("USER: %s\\n", getenv("USER"));
return 0;
}
函数原型:char *getenv(const char *name);
参数:环境变量名(字符串)
返回值:环境变量的值,如果不存在则返回NULL
特点:
只能获取单个特定的环境变量
使用方便,不需要遍历整个环境变量表
在stdlib.h头文件中声明
| main第三个参数 | 简单直接 | 只能在main函数中使用 | 需要遍历所有环境变量 |
| environ变量 | 可在任意位置访问 | 需要extern声明 | 需要遍历所有环境变量 |
| getenv() | 使用方便,针对性强 | 只能获取单个变量 | 获取特定环境变量 |
🔧八、环境变量的全局属性
环境变量通常具有全局属性,可以被⼦进程继承下去
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *env = getenv("MYENV");// 尝试获取环境变量MYENV
if(env){
printf("%s\\n", env); // 如果存在则打印
}
return 0;
}
直接查看,发现没有结果,说明该环境变量根本不存在 导出环境变量 export MYENV=“hello world” 再次运行程序,发现结果有了!说明:环境变量是可以被子进程继承下去的!想想为什么? 内键命令,不创建子进程,让bash亲自执行,具有全局特性。
关键点:
当使用fork()创建子进程时,子进程会完整复制父进程的环境变量表
export命令将变量加入到当前shell的环境变量表中
后续从这个shell启动的所有程序(子进程)都能继承这些环境变量
# 1. 在当前shell设置环境变量(只影响当前shell及其子进程)
export MYVAR="value1"
# 2. 启动新程序(子进程继承MYVAR)
./program1 # 能获取到MYVAR
# 3. 新开一个终端窗口(新的shell进程)
# 在这个新窗口运行:./program1
# 获取不到MYVAR,因为不是从原shell派生的
| 内建命令 | 由bash直接执行 | ❌ 不创建子进程 | ✅ 可以修改当前shell环境 |
| 外部命令 | 执行磁盘上的程序 | ✅ 创建子进程 | ❌ 只能影响子进程 |
总结要点:
环境变量具有全局性:在同一shell会话中,通过export设置的变量对所有子进程可见
继承机制:子进程通过复制父进程的环境变量表实现继承
作用域限制:环境变量的修改只影响当前进程及其后代进程
内建命令特殊性:bash内建命令直接操作shell自身,具有"全局特性"
生命周期:环境变量随进程结束而消失(除非写入配置文件)

加油!志同道合的人会看到同一片风景。 看到这里请点个赞,关注,如果觉得有用就收藏一下吧。后续还会持续更新的。 创作不易,还请多多支持!




