一、命令行参数
问大家一个问题,我们的main函数是否有带参数呢?
答案是:有

首先我们来看看这两个参数是啥意思,首先是argv[],这个参数就是命令行参数,然后argc就是表示我们命令行参数argv中有多少个数据。
那么其有啥用处呢?
命令行参数的本质应用是为了实现一个命令,其可以根据不同的选项做出不一样的操作,实现不一样的子功能,也是Linux中所有的命令选项功能的实现方式。
下面我们来实验一下:


可以看到我们在系统中运行这个程序的时候,其会根据我们在命令行输入的字符串进行判断,其判断是以空格符来进行分割的,遇到空格符就是一个命令行参数。
下面我们总结为三个细节:
细节1:
命令行参数至少有一个,cgrc>=1,argv[0]一定会有元素,其就是我们的程序名
细节2:
选项是以空格符进行分割的字符串,一个字符也是字符串,连续的空格符也是算一个,直到遇到不为空格符的才会被认为是一个字符串
细节3:
argc个,那么argv[argc-1]就是最后一个==NULL
下面我们演示一下其对于命令行是如何操作的:


二、环境变量
首先我们提一个想法,前面我们说到的,系统中的命令其实际上也是使用的命令行参数的形式进行的,但是我们发现,我们自己手动实现的程序需要进行运行的话,我们的命令是./程序名
然后我们的系统给的命令就可以直接使用。
那么我们./的作用是啥呢?
其作用是告诉我们的OS我们的程序的相对路径,./就是表示我们当前的工作路径。

可以看到我们的很多自带的指令其都是在/usr/bin路径下的,那么是否我们的程序放在这个路径下就可以实现输入程序名字就可以了呢?
我们来试试:

可以看到我们将text放在/usr/bin路径下的时候,那么就可以直接输入名字就运行了,那么本质上是否是这样呢?
其实不是,在Linux下,其有一个环境变量PATH,我们可以使用echo将其在屏幕上打印出来看其详细内容:
语法:echo $PATH
这个就和我们前面学习C语言一样,类似取地址符号这样:
结果:

可以看到其在屏幕上输出的结果是一堆的路径,可以看到我们的/usr/bin就在上面,这个就是我们这个路径下的程序不需要给OS告诉路径的原因,我们的OS对于没有指出路径的命令,那么其会来这边找是否在这里面。
所以我们要想我们自己写的程序可以直接输入名字就可以使用,那么我们就可以将我们的目录添加入这个环境变量中。
添加语法:
export PATH=$PATH:要加入的目录
这个是我们其中一个环境变量,下面我们看看环境变量的概念
环境变量的概念:
一般是指在操作系统中用来指定操作系统运行环境的一些参数。
比如我们在编写C\C++代码的时候的头文件,可以让我们在链接的时候虽然不知道我们的动静态库在哪里,但是其一样可以链接成功,然后生成可执行程序,原因就是相关环境变量在帮助查找。
其是系统级的变量,变量名和变量内容,其往往具有全局的属性。
下面是我们常见的几个环境变量:
PATH:告诉系统对于没有指定路径的命令,去那个路径下找
HOME:你的家目录路径,可以直接cd ~直接进入
USER:当前登录的用户名
SHELL:当前的Shell,一般是/bin/bash
那么这些环境变量和我们的C\C++代码还有进程之间有啥关系呢?
我们的main函数其实还有一个参数的

env就是我们的环境变量表,就是存储我们的环境变量的信息的。我们可以将其打开看看

可以看到上面的几个信息,其实env中还有很多信息,这只是其中的一点点。
我们看到其中有一个PWD,那么其就是存储的我们当前的工作目录的,然后还有就是HOME,其存储的是我们上一次工作所在的目录。

每一个程序都会收到一个环境表,环境表是一个字符指针数组,每个指针指向一个以\0为结尾的环境字符串的。
那么我们好奇的是这个环境变量表是谁传入的呢?
首先,其将环境变量表传入,本质是将环境变量表传入给进程,那么我们第一个进程的环境变量表是谁传入的呢?
其实是其父进程传入的,然后我们的程序、命令等都是bash的子进程,前面我们讲过子进程是会继承父进程的代码和数据的。
那么我们的bash进程的环境变量又是从何而来的呢?
我们的bash进程的环境变量表是开始启动的时候从Linux配置文件中得到的。
然后我们的子进程的子进程也是可以看到env[],所以我们的环境变量是具有全局属性的。