1.环境变量
1-1 概念介绍
- 环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数;
- 如:在编写C/C++代码的时候,在链接的时候,从来不知道所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
- 环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性。
命令行参数:
函数有参数,没有参数也用void表示传空;那么main函数作为整个程序的入口,是不是也有参数呢,有的话是什么?
事实上main函数也有参数,main函数被系统start函数调用,main函数的参数为main(int argc,char* argv[]);int argc表示参数的个数,char * argv[]是一个指向字符或字符串的数组。
编写代码查看数组内的内容:


先被bash获得,然后被切分为不同选项放入指针数组中。
再来看看下面的程序代码:

这个程序代码清晰地表示出了:命令行参数用途是为了让一个程序通过选项,实现不同的子功能。
main函数的命令行参数,是实现程序不同子功能的方法。这也是指令选项的实现原理。在main函数启动时,对应的进程中会有一张argv表,用来支持实现选项功能。
为什么之前写main函数不用写这两个参数?因为我们的程序只有一个功能。
1-2 一个例子,一个环境变量
要执行一个程序,必须先找到它,(谁找?bash找,通过PATH来找环境变量),所以每次执行我们自己的程序时需要加上./code.c,那为什么执行系统命令时不用添加路径呢?因为系统中存在环境变量,来帮助系统找到目标二进制文件。
环境变量:PATH,系统中搜索指令的默认搜索路径。
查看环境变量:

一个路径一个路径地找,以冒号作为分隔符,如果都没有找到就会报错。
【问题1】站在存储的角度上,如何理解环境变量呢?
在系统初始启动时,在bash内部形成一张环境变量表,这张表就是一个指针数组的样子,我们查看到的环境变量的内容都是用指针一个一个指向的。
bash行输入命令时,命令行参数表先获取输入内容的命令参数,然后再由bash获取指令的环境变量,一个一个对应匹配去环境变量表中找到它的路径,所以bash内部有两张表。

【问题2】环境变量,最开始从哪里来的呢?
环境变量最开始是从系统相关的配置文件来的。

【问题3】为什么有些指令可以直接执行,不需要带路径,而我们的二进制程序就需要带路径才能执行?
如果把我们自己的环境变量配置放入这个系统默认的环境变量文件中,再去执行代码的编译运行,那么编译时就不用带路径了。
如果Linux系统有十个用户登录呢?存在十个bash,然后从自己的环境变量表中读取对应的系统配置文件。
1-3 认识更多的环境变量
- HOME:环境变量是当前用户的家目录
- PATH:指定命令的搜索路径
- SHELL:当前shell,它的值通常是/bin/bash

1-4 获取环境变量的方法
1.环境变量相关的指令
export MYENV 导入自己的环境变量
env 显示所有的环境变量
echo $xxxx 显示某个环境变量值
unset 取消设置自己的环境变量
2.命令行参数最多有几个?
命令行参数最多有3个,是父进程传递给我们的
3.获得环境变量的方法:
方法一:main函数获得父进程的(bash)环境变量,环境变量可以被子进程继承。
方法二:getenv,获得指定环境变量
方法三:environ,获取所有环境变量的列表
1-5 理解环境变量的特性
1.环境变量具有全局特性
2.补充概念,给后面的内容埋个伏笔
a.本地变量

这个是本地变量,但bash会记录环境变量和本地变量,可以用set来查看,本地变量不会被子进程继承,只在bash内部被使用。