Linux进程——(4)命令行参数、环境变量
一、命令行参数
我们在平时用的ls等命令,其实每条指令都是一个进程,只不过很快就跑完了,后面跟的-l -a都是选项。这些指令貌似不需要我们传参就可以运行,但有的命令是需要传参的,我们回到C语言中的main函数来看一下。
我们平常用main函数几乎都是不写参数的,但实际main函数也是可以传参的,具体为
int main(int argc,char*argv[])
这个参数具体有什么用呢?我们验证一下先。
结果显示argc为1,argv[0]是./code(一个字符串),但当我们输入./code 1运行时,agrc变成2了,argv[1]为1,argv[0]不变,当我们输入./code 1 2运行,argc为3,argv[2]为2。我们输入字符串运行也是如此,下图我们输入./code abcd xyz运行
我们把main函数的参数称为命令行参数列表。argc表示参数个数,argv是参数的清单。我们的命令后面跟的选项,其实就是根据这种原理实现的,把每个选项都看成传参,不同的参数代表不同的功能。它存在的意义就是同一个程序,根据命令行参数,不同选项,实现不同功能。那么main函数的参数是谁传递的?答案是shell,我们的参数就是一个个字符串然后被shell获取,按照空格分隔形成两张表argc和argv塞入数据,且对于数据(只读)子进程也能看到。
二、环境变量
其实,main函数不止两个参数,还有一个指针数组char*env[],我们先看一下里面都存放着啥
这些就是我们的环境变量,查找对应环境变量的内容我们输入echo $name即可。环境变量的作用是:操作系统在完成系统功能时需要的一些参数。 这些环境变量都在系统配置文件中,当我们启动shell时,会自动读取当前家目录下,形成对应环境变量。想查看所有环境变量输入env指令即可。我们来看一下常见的环境变量。
1.PATH
我们之前说过,我们想运行一个程序,需要./name而不能直接输入name,这是因为系统找不到,而为什么我们输入指令就可以不用带./呢?因为当程序要运行,系统会自动去/user/bin目录下找,而指令都在该目录下,但程序没有就找不到,但为什么系统知道命令在/user/bin下呢?就是靠PATH这个环境变量告诉shell要到此目录找。PATH中有很多路径,以:分开,系统就会在这些目录下寻找目标程序,因此PATH也叫路径集合。所以如果我们想直接输入name执行程序,要么cp到/user/bin下,要么把当前目录添加到PATH:
PATH=$PATH :当前目录
这个操作当我们重启后就会失效。
2.HOME
表明当前用户所在的家目录,我们启动系统时,系统会自动创建bash文件,bash读取环境变量相关的配置文件,然后HOME就会被设置,然后就会把bash的cwd设置成环境变量的家目录。所以我们登录时就会在自己的家目录下。
总之,我们可以借助系统的环境变量来实现一些功能,许多指令+选项的原理也是靠环境变量实现的。
3.环境变量的理解
环境变量是系统提供的具有“全局”属性的变量,就相当于C语言中的全局变量。与环境变量对应的还有本地变量。
本地变量相当于我们自己定义的变量,定义后也可以直接使用,当我们定义变量时候,语句相当于一个字符串被存放,当我们输入$时,系统会去保存的地方去匹配字符串并输出。我们如果想查看所有的本地变量可以输入set命令(查看所有的环境变量和本地变量)
其实我们可以把本地变量变成环境变量
export name
export的变量重启shell时会清除。
当我们登录时,操作系统会创建一个当前用户的bash进程,bash会根据配置文件形成一张环境变量表(char*env[]),还会有一张argv表,还有一个本地变量表(存放本地变量的指针数组)。
我们也可以用export i=20直接放入环境变量,我们知道,我们启动的进程,是从父进程来的,因此环境变量是可以被子进程继承的,本地变量不能。(对于我们平常的程序都是子进程,他们的父进程是bash,当然,也可以被我们fork出的所有子进程看到使用,所以体现了全局性。)
取消环境变量的命令是unset name。