【Linux】命令行参数和环境变量
目录
一、命令行参数
二、环境变量
(一)PATH
(二)查看环境变量
(三)获取环境环境变量
(四)为什么要环境变量
(五)环境变量特点总结
(1)环境变量具有全局性
(2)内建命令
正文:
一、命令行参数
我们都知道,在调用函数时需要传参,平时我们接触最多的就是main函数。如下图
main函数可以有参数吗?可以有几个?是哪几个呢?
main函数是有参数的,有一个char* argv[ ]指向一个一个字符串的指针数组,最后以NULL结尾,和int argc 表示argv[ ]元素个数,那么argv[ ]到底指向谁呢?直接打出来看一下:
编译后,好奇怪哦,怎么输出的是我们在命令行输入的./a.out指令
那我再带个-a -b -c呢,最后发现我们命令行输入的是字符串,最后被人打散成“./a.out” “-a” “-b” “-c”然后依次放入argv中,所以argv[ ]用于存放命令行输入的参数,全是用空格隔开的字符串。
由此可见,我们在命令行输入的命令ls本质是程序,它后面跟着的-l -a叫选项,是一个个字符,可以通过一定的方式传递给命令行内部的main函数,在ls内部实现时就可以根据不同选项实现类似功能的不同表现形式。说人话就是:我们命令后面带的选项本质是通过命令行参数实现的。
那输入这些命令时最先被谁获取到?父进程bash!!而你启动的所有程序都是bash的子进程,而父进程的数据通过fork()后是可以被子进程拿到的。所以我们进程启动时会默认维护一个数组,bash将命令行参数打散放入数组中以NULL结尾,这就是命令行参数表!!
结论:argv[]中至少有一个元素(程序名,如ls);进程的程序名字一般放argv[0];命令行上命令用空格隔开,有几个子串,argc就是几。
二、环境变量
(一)PATH
Windows操作系统上我们安装软件最头疼的莫过于配PATH环境了,什么乱七八糟的一堆
PATH是系统级全局变量,具有不同用途,目的是可执行程序路径查找。Windows和Linux下都有PATH
为什么装程序总要配环境呢?
因为你要执行一个程序系统得通过文件名+路径找到它。操作系统查找命令是在环境变量PATH中找!PATH包含了一串路径,如果在这全部路径中没找到执行指令的地址路径就报错!!
而没有配PATH我们要执行程序得自己把程序所在位置路径带上,比如打开Python你得输入它在C盘哪个文件中的.exe文件。每次这样输入太麻烦了,我就想在控制台输入个Python不带路径就打开Python,这时就体现配PATH的好处理:以后执行命令可以不带路径,它会自动找到拼上要执行程序路径直接运行,同时也做到了系统中随处可用(比如Linux中你在任何文件下输入ls命令)。
Linux中执行ls是在/usr/bin路径下找,而PATH包含了这个路径。
(二)查看环境变量
查看环境变量:env
env回车后可以看到进程环境变量,将全部环境变量可看成一个一个由K=V组成的字符串,系统会把环境变量通过指针数组形式维护成一张表,将字符串地址放入,就生成一张以NULL结尾的环境变量表。
(三)获取环境环境变量
方法一:main的第三参数获取
main函数其实还有第三个参数env这是一个指针数组,存放的是一个个环境变量,通过以下代码可以查看
方法二:getenv
getenv(环境变量名)获取单个环境变量
方法三:environ
这是C语言提供的一个全局变量指针,它是一个二级指针,直接指向我们上面的char* env[ ]
我们可以通过以上三种方法获得环境变量,这三种方法获得的环境变量从哪里来呢?
是进程启动时自动生成环境变量表,那么进程又是从哪里拿到环境变量生成环境变量表?
其实不是你的进程获得环境变量!是你的父进程(bash)获得环境变量生成环境变量表,而你当前子进程继承了父进程的环境变量表,所以对应也就看到了数据。bash获取环境变量是从系统的配置文件中来!!!
验证:
先cd ~到家目录下,ls -al查看所有隐藏文件,你会看到bashrc和bash_profile,通过vim查看两个文件看bash如何通过系统的配置文件获取环境变量。
以下是脚本,不用管,了解就行。
(四)为什么要环境变量
不同的环境变量有不同的用途,比如有些环境变量记录用户名,有些记录默认路径......
进程会记录下自己的工作路径(cwd),bash的cwd在自己的PCB内部保存,而bash自己要获取cwd时通过系统接口getcwd更新环境变量,getcwd是进程启动后动态获取的
所以:环境变量大部分从系统配置文件来,也有少部分是启动之后动态获取或创建
(五)环境变量特点总结
(1)环境变量具有全局性
通过父进程fork创建子进程,全部子进程都继承父进程的全局变量——全局性
(2)内建命令
bash自己内部定义的一个函数,通过函数调用执行不需要依赖环境变量表
Linux中大部分命令是可执行程序,需要通过创建子进程执行(ls...)有一部分命令执行时没有风险,需要bash自己执行叫做内建命令。
本次分享的重点在于:知道程序运行时会自动生成两张表,命令行参数表(一直在变)和 环境变量表(内存级的比较稳定)
希望利己的同时也利他,感谢阅读~下次再见