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

环境变量

基本概念

环境变量(environment variables)⼀般是指在操作系统中⽤来指定操作系统运⾏环境的⼀些参数

如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪

⾥,但是照样可以链接成功,⽣成可执⾏程序,原因就是有相关环境变量帮助编译器进⾏查找。

环境变量通常具有某些特殊⽤途,还有在系统当中通常具有全局特性

命令行参数

命令行参数本质是用户传递给程序的初始输入数据,通过终端输入,由 Shell(如 bash)解析后传递给程序的 main 函数。
例如在终端执行指令:./code a b c d,其中:

./code 是待执行的程序名;

abcd 就是传递给 code 程序的命令行参数

程序启动后,这些参数会被存储在专门的数组中,供代码逻辑调用。

从存储的角度理解环境变量

从 bash 的角度来看,环境变量的存储始于用户登录时 —— 我会加载系统全局配置文件(如 /etc/profile)与用户个人配置文件(如~/.bashrc、~/.bash_profile),将文件中通过 export 定义的 “名称 = 值” 格式变量解析后,存入我内部维护的 “环境变量表” 中,这个表本质是一个以 NULL 结尾的字符串指针数组(对应全局变量 environ),数组每个元素指向独立的环境变量字符串(如 "PATH=/usr/bin:/bin"),且整体存储在我所属进程虚拟地址空间的高地址区(栈区上方,与命令行参数 argv 紧邻);同时,我还会维护另一块独立的 “本地变量表”,存放未用 export 声明的变量(如直接定义的 i=10),这两块表互不干扰,本地变量仅在我内部生效,不会被存储到环境变量表中。当我启动子进程(如执行./code)时,会将自身环境变量表及关联的变量字符串完整复制一份,存入子进程的对应内存区域,实现环境变量的继承,而子进程后续对环境变量的修改仅作用于其自身的副本,不会影响我原有的环境变量表;直至我终止(用户退出登录),我维护的环境变量表及相关内存才会被释放。

环境变量是从系统的相关文件中来的。

常⻅环境变量

PATH : 指定命令的搜索路径

HOME : 指定⽤⼾的主⼯作⽬录(即⽤⼾登陆到Linux系统中时,默认的⽬录)

SHELL : 当前Shell,它的值通常是/bin/bash。

查看环境变量

查看单个环境变量:用 echo $变量名$ 是 “引用环境变量” 的标识,缺一不可。

# 查看当前用户主目录
echo $HOME  
# 输出:/home/whb# 查看命令搜索路径
echo $PATH  
# 输出:/usr/local/bin:/usr/bin:/bin

和环境变量相关的命令

1. echo: 显⽰某个环境变量值

2. export: 设置⼀个新的环境变量

3. env: 显⽰所有环境变量

4. unset: 清除环境变量

5. set: 显⽰本地定义的shell变量和环境变量

环境变量的组织⽅式

每个程序都会收到⼀张环境表,环境表是⼀个字符指针数组,每个指针指向⼀个以’\0’结尾的环境

字符串

通过代码如何获取环境变量

C 语言的 main 函数其实支持三个参数:argc(命令行参数个数)、argv(命令行参数数组)、envp(环境变量数组)。envp 是一个字符串指针数组,每个元素指向一个 “名称 = 内容” 的环境变量,以 NULL 结尾。

main 函数的第三个参数

#include <stdio.h>// argc:命令行参数个数,argv:命令行参数,envp:环境变量数组
int main(int argc, char *argv[], char *envp[]) {// 遍历 envp,打印所有环境变量for (int i = 0; envp[i] != NULL; i++) {printf("env[%d]: %s\n", i, envp[i]);}return 0;
}

全局变量 environ

系统提供了一个全局变量 extern char **environ,它直接指向环境变量数组,无需通过 main 参数传递,使用更灵活。

#include <stdio.h>// 声明全局环境变量数组 environ
extern char **environ;int main() {// 遍历 environ,打印所有环境变量for (int i = 0; environ[i] != NULL; i++) {printf("env[%d]: %s\n", i, environ[i]);}return 0;
}

环境变量通常是具有全局属性的

很多人会疑惑:为什么 export 后的环境变量能被子进程继承?这要从 “进程的环境变量来源” 和 “父子进程关系” 说起:

  1. 环境变量的初始来源
    当用户登录 Linux 时,系统会加载一系列配置文件(如 /etc/profile~/.bashrc~/.bash_profile),这些文件中定义的环境变量(如 PATHHOME)会被初始化到当前 Bash 进程的 “环境变量表” 中。

  2. 父子进程的环境继承
    Bash 是父进程,当我们通过 Bash 启动一个程序(如 ./test)时,程序会成为 Bash 的子进程。此时,Bash 会将自己的环境变量表复制一份传给子进程,因此子进程能读取到父进程的环境变量。
    反之,子进程修改环境变量不会影响父进程 —— 因为子进程操作的是 “复制后的副本”,而非父进程的原表。

  3. 本地变量 vs 环境变量

  4. 未用 export 的本地变量,仅存在于当前 Bash 的 “本地变量表” 中,不会被复制到子进程,因此子进程无法读取。这就是为什么直接 i=10 后,启动的程序看不到 i 的原因。


文章转载自:

http://8ViR2RHj.rbnnq.cn
http://i0zeR9NM.rbnnq.cn
http://Y7SaLEX6.rbnnq.cn
http://TuceTYf9.rbnnq.cn
http://BMKfYFhe.rbnnq.cn
http://iLnN8wp9.rbnnq.cn
http://zDUYVyaN.rbnnq.cn
http://umbHgXWO.rbnnq.cn
http://PjAhgMOt.rbnnq.cn
http://4BEO6gWb.rbnnq.cn
http://V7JYo0uh.rbnnq.cn
http://JRLvnXIs.rbnnq.cn
http://9fpwGnHD.rbnnq.cn
http://mkAdJp17.rbnnq.cn
http://s5G0prJf.rbnnq.cn
http://egyuEeQU.rbnnq.cn
http://UhfPJOo4.rbnnq.cn
http://3PkcfbON.rbnnq.cn
http://DgwAYSwQ.rbnnq.cn
http://RCwMblc2.rbnnq.cn
http://bM8o7afk.rbnnq.cn
http://nRpss0pb.rbnnq.cn
http://tXI8Qe61.rbnnq.cn
http://OIuuBcNk.rbnnq.cn
http://Ga3vgEKI.rbnnq.cn
http://KE3kodJR.rbnnq.cn
http://Up9k69GJ.rbnnq.cn
http://FW3neRZn.rbnnq.cn
http://pEMbj1RL.rbnnq.cn
http://Edni9fmD.rbnnq.cn
http://www.dtcms.com/a/377391.html

相关文章:

  • Codeforces Round 1049 (Div. 2)
  • Eclipse下载安装图文教程(非常详细,适合新手)
  • vue2迁移到vite[保姆级教程]
  • 基于webpack的场景解决
  • Vite 中的 import.meta.env 与通用 process.env.NODE_ENV 的区别与最佳实践
  • 除了Webpack,还有哪些构建工具可以实现不同环境使用不同API地址?
  • sklearn聚类
  • I.MX6UL:汇编LED驱动实验
  • 计算机毕设 java 高校机房综合管控系统 基于 SSM+Vue 的高校机房管理平台 Java+MySQL 的设备与预约全流程系统
  • 设计模式-建造者观察者抽象工厂状态
  • 第5讲 机器学习生态构成
  • JAVA秋招面经
  • LVS群集
  • 半导体功率器件IGBT工艺全流程
  • Q3.1 PyQt 中的控件罗列
  • 深入解析ReentrantLock:可重入锁
  • ARM处理器总线架构解析:iCode、D-code与S-Bus
  • Qoder 前端UI/UE升级改造实践:从传统界面到现代化体验的华丽蜕变
  • Flutter多线程
  • 如何在高通跃龙QCS6490 Arm架构上使用Windows 11 IoT企业版?
  • JavaScript 对象说明
  • CMake目标依赖关系解析
  • 小型企业常用的元数据管理工具
  • 论文AI写作哪个软件好?实测对比5款热门AI写作工具
  • PostgreSQL 内机器学习的关键智能算法研究
  • 12公里无人机图传模组:从模糊到超高清的飞跃,抗干扰能力全面升级
  • GitHub Actions中steps下面的Setup environment设置的环境变量不能在后面步骤使用问题处理
  • YOLOv5实战-GPU版本的pytorch虚拟环境配置
  • 苍穹外卖项目实战(day7-2)-购物车操作功能完善-记录实战教程、问题的解决方法以及完整代码
  • 【VsCode】离线状态下安装插件