目录

一、前言

二、命令行参数

三、环境变量

1.修改环境变量

2.在bash中查看所有环境变量

3.获取环境变量的方法

4.main函数的第三个参数env

5.自定义环境变量

6.内建命令和常规命令


一、前言

本文着重介绍环境变量这一概念,从常见的main函数的参数列表出发,介绍了Linux中执行命令的本质--就是运行程序+命令行参数,随后认识了bash中所有的环境变量和获取、修改环境变量的方法,认识环境变量表,和自定义环境变量的区别,认识指令分类为内建命令和常规命令。


二、命令行参数

main函数其实是有参数的,它们分别是argc和argv,这两个参数又被称为命令行参数

int main(int argc , char* argv[])  

argv是一个数组,指向的元素类型是char*,而agrc就是这个数组的元素个数

那么这个数组中存在着什么呢?我们不妨设计一个程序来验证一下:

此时我们就能得到结论,OS会把命令行输入的字符串放入main函数的参数列表中。

有没有觉得有点熟悉?如果把上图的1,2,3等字符串换为-l,-a等,是不是很像我们在Linux中使用的各种指令?例如ls -l ,ls就是可执行程序名,-l就是参数,调用指令其实就是运行一个程序。


三、环境变量

通过上述对main函数参数的了解,我们知道了指令的运行方式,但是这里有一个不同,为什么我们自己写的程序需要先写个 ./ ,而指令却不用呢?这里就得引出一个概念:环境变量PATH

在运行程序时,系统首先会去PATH中找当前可执行程序在不在这些路径中,如果在就直接执行程序,不在就报错,而我们自己写的程序不在这些路径下,就需要加个./让OS在当前目录下寻找我们写的程序。

使用 echo $PATH 来查看环境变量:

这些路径以冒号:分隔


1.修改环境变量

要想我们的程序像系统指令一样运行,我们可以将自己写的程序的路径加入到环境变量PATH中,使用指令:PATH = $PATH:要添加的路径

注意:当你将你的路径添加到PATH后,下次重启又会恢复默认路径,如果你想一劳永逸的话,可以将你写的程序直接放在默认PATH下


2.在bash中查看所有环境变量

使用指令:env 就能进行查看所有环境变量

会有很多密密麻麻的环境变量,但这里我们只需要认识几个:PWD,HOME,PATH

PWD:记录当前路径,平时执行的pwd指令就是通过获取PWD环境变量知道的

HOME:cd ~回到家目录,这个所谓的家目录就是HOME变量


3.获取环境变量的方法

使用函数:getenv() 即可获得对应环境变量的内容

如下代码:就可以获得环境变量PATH的内容

char* p = NULL;
p = getenv("PATH");

4.main函数的第三个参数env

其实main函数还有第三个参数,字符串数组env,没错它就是环境变量表。现在我们知道了系统在程序启动时会给main函数提供两张表:命令行参数表和环境变量表。

使用如下的代码可以查看环境变量表:


5.自定义环境变量

我们可以在bash中直接定义环境变量,使用指令:环境变量名=内容 

然而用户自定义的环境变量是本地的,env表中并不会出现刚才在bash中自定义的环境变量,如果我们想把其放在系统的环境变量中,就需要使用指令:export 环境变量名

然而上述的修改、定义环境变量都是在修改bash进程内部的环境变量信息,每一次重新登陆都会形成新的bash解释器,而bash会自动从家目录下的bash_profile文件中读取信息形成一份新的环境变量表。之所以每次重启后我们自定义的环境变量就不见了,是因为它没有被配置到配置文件bash_profile中。

并且在创建子进程时,这张表会通过main函数的参数传递给子进程,因此子进程也有和父进程一样的环境变量表,因此环境变量具有全局性


6.内建命令和常规命令

通过之前的学习,我们知道之所以能够直接使用系统指令,是因为环境变量,如果我们将PATH置空,这些命令是不是就不能运行了呢?

可以看见PATH被置空后,像ll这种指令确实失效了,但pwd却还能继续运行,这是为什么呢?

命令也分为两类:

  • 常规命令:bash创建子进程执行的
  • 内建命令:bash自己执行的

很明显pwd是内建命令,而ll是常规命令。其实像echo也是内建命令,之前我们自己定义的本地环境变量使用echo都能打印出来,而env环境变量表却没有,其实是因为echo是bash进程自己的程序,自然能发现自己内部的变化,而其他进程只是父进程的子进程,无法得知父进程的本地变量。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐