1. 环境变量的引入
先描述一个现象,我们在执行二进制可执行程序的时候,是需要找到其所在位置的(程序要运行必须先加载到内存,是因为冯诺依曼体系结构规定CPU只能从内存中读取数据),所以这也就是为什么我们在运行前带上./的原因,可以让操作系统找到并执行对应的指令,那么这时候,我们就好奇了,那指令在执行的时候前面为啥不带./呢?
答案:操作系统需要提前做好准备工作(会将操作系统中的配置文件内的软件默认的安装路径导到内存当中),构建出一个内存级变量(环境变量PATH)
操作系统在启动shell的时候,将PATH导入到shell的上下文环境当中,在执行指令时,通过PATH当中的路径来查找指令对应的位置
上述的PATH也只是解决一个应用场景,如何查找命令的路径
操作系统中还存在许多问题?
比如说当前登录系统的用户是谁,主机名是谁,历史命令的条数是多少,显示器的配色方案是啥?
所以针对这一系列的应用场景,就需要要求操作系统在启动bash命令行解释器时,就必须预先设置好一批未来可能会用到的变量(全局变量),这批变量就叫环境变量
从解释型语言来理解环境变量:
C语言/C++中是可以定义变量的,同样的在命令行上也能进行变量的定义。
而且shell也是进程,malloc或者new是可以在运行的过程中给我们申请空间,也就意味着进程在运行期间是可以对空间进行调整的(只要存在空间就可以保存数据,所以环境变量本质上就是一段数据:“字符串”),所以环境变量的导入也就是在进程中定义或者malloc/new加载进来
2. 常见的环境变量
2.1 PATH
指定命令的搜索路径(详细内容看上面的引入)
2.2 USER
2.3 PWD
2.4 其他一些环境变量
环境变量存在的意义:在不同的应用场景下,可以让用户访问环境变量来达到目的(方便用户使用)
3. 和环境变量相关的命令
3.1 echo: 显示某个环境变量值
3.2 export: 设置一个新的环境变量
3.3 env: 显示所有环境变量
首先bash是一个系统进程,而./mycmd 运行程序后,该程序变成进程,而该进程又是bash的子进程(媒婆:王婆招实习生,创建子进程进行命令执行)
通过以上结果可以得出以下结论:
环境变量具有全局属性,是因为会被子进程继承下去(环境变量本来就是定义给bash使用的)
至于子进程为什么要继承下去呢?
–因为存在不同的应用场景(例如:让bash找指令路径PATH,用户身份识别 USER)需要子进程去完成(也就需要获取到环境变量)
所以这时候,我们也能理解环境变量的全局性和本地变量的局部性(只在当前进程bash下有效)
在myval 并未被导入到全局时,也就只有bash可以使用,而被导入过后其子进程也可使用
3.4 set: 显示本地定义的shell变量和环境变量
3.5 unset: 清除环境变量
4. 通过代码如何获取环境变量
4.1 命令行参数的概念
程序名+选项==命令行参数