命令行参数和环境变量
摘要:本文介绍了命令行参数和环境变量的基本概念与应用。命令行参数通过main函数的argc和argv接收,实现程序动态配置;环境变量如PATH、HOME等则用于系统运行环境设置。文章详细讲解了环境变量的查看、设置(export)、删除(unset)等操作方法,以及通过C代码获取环境变量的三种方式(env参数、environ变量、getenv函数)。特别指出环境变量具有全局性可被子进程继承,而本地变
目录
一、基本概念
命令行参数是程序运行时,通过命令行(终端 / 控制台)传入程序的额外参数,用于在不修改代码的情况下,动态配置程序行为(比如指定输入输出文件、设置运行模式等)。
C 语言中,main 函数支持两个参数来接收命令行参数,是最经典的实现:

argc(argument count):参数个数(包含程序名本身,所以最小为 1);
argv(argument vector):参数数组(字符串指针数组),每个元素是一个命令行参数:
argv[0]:程序本身的路径 / 名称(比如 ./a.out 或 test.exe);
argv[1]~argv[argc-1]:用户传入的实际参数;
argv[argc]:固定为 NULL(作为数组结束标志)。
程序运行结果如下:
当输入./code1时,会输出:

当输入./code1 -a -b -c -d时,会输出:

这就和我们在使用ls命令时,通常会使用该命令的参数 -a -l -r -t来实现不同的子功能类似
命令行参数的本质应用,是为了实现一个命令可以根据不同的选项,实现不同的子功能。这也是Linux中所有命令选项功能的实现方式。
环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数
如:我们在编写 C/C++ 代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性
Linux下存在一个系统级的全局的环境变量PATH
我们可以使用用echo命令+$PATH查看该环境变量的内容
该环境变量的作用Linux告诉系统,如果用户执行一个可执行文件,没有指明路径,系统就会默认在PATH环境变量的路径下查找。PATH环境变量本质是协助Linux进行指令查找的一个环境变量。
那我们是否能把我们自己所写的可执行文件添加到PATH环境变量的路径里呢?
答案是肯定的。我们只需要使用PATH=$PATH:当前路径,就可以把我们当前的路径添加到环境变量中,这样我们就能直接执行我们生成的可执行文件。如下图所示:

要注意的是不能直接让PATH=当前路径,这样只会把原来的默认路径给覆盖掉,导致系统的很多自带的命令无法使用。如下图所示,前面所写的可执行文件code1可以直接执行,但是系统自带的ls却无法执行了,因为原来的路径被我们设置的路径覆盖了,系统无法再在原来的路径下找到ls命令

二、常用环境变量
如何查看当前用户下相关的所有的环境变量呢?
使用env命令就可以查看所有相关的环境变量,如图

以下是常用的环境变量:
PATH:指定命令的搜索路径
HOME:指定用户的主工作目录 (即用户登陆到 Linux 系统时,默认的目录)
SHELL:当前 Shell, 它的值通常是 /bin/bash。
三、环境变量和c/c++代码\进程之间的关系
3.1用代码获取环境变量
从前面的命令行参数部分我们可以知道,main函数是有参数的
我们还可以在后面再添加上char* env[]
如下:
int main(int argc,char *argv[],char* env[])
char* env[]是环境变量表,这个操作本质上是把环境变量表传递给进程
环境变量的组织方式如下图:

可以通过三种方式获取环境变量
1.当知道argc、argv[]和env[]三个参数时

环境变量:

2.char ** environ
使用getenv时需要包含头文件unistd.h

环境变量(同上):

3.getenv(环境变量名)
使用getenv()时需要包含头文件stdlib.h

编译后:

不同的环境变量,具有不同的使用场景
环境变量是父进程给子进程的。bash有两张表——命令行参数和环境变量表。子进程和父进程的数据是共享的,只是在后面部分使用fork()分流,因此父进程的全局变量子进程也可以识别得到。所以bash创建子进程后,子进程可以接收到bash的命令行参数和环境变量表,子进程再创建子进程,子进程的子进程也可以识别到这两张表。所有环境变量发起的位置是从bash开始的。而bash进程的环境变量是从Linux系统的配置文件中来的,程序启动前bash会读取配置文件的内容,将环境变量加载到进程的上下文。这也就能解释为什么修改了环境变量后,关闭xshell后重新打开,环境变量会重新刷新。
3.2设置环境变量
在设置环境变量之前首先需要提到一个概念叫本地变量。
本地变量和环境变量的区别就在于本地变量不能被子进程继承,不具备全局性,只能在bash内部访问。在这里先提前声明两种变量的区别,下文会做解释。
设置环境变量,首先需要设置一个本地变量。我们可以直接在命令行中输入想要设置的本地变量的名字=+内容,例如:TEST_ENV=123456789。
设置成功后会发现在输入env |grep TEST_ENV时,找不到这个环境变量。但是输入echo $TEST_ENV却可以查看环境变量的内容。
此时需要使用export TEST_ENV,将该本地变量导出到环境变量表中,这样才能被bash找到。

这也就说明了环境变量和本地变量的区别:本地变量只能在bash内部访问,而不能在全局下访问。由于本地变量缺少全局性,也就使得它不能被子进程所继承。如果想要全局下访问,就得使用export命令。而export命令本质上就是把我们所设置的环境变量导入到环境变量表中,将本地变量转化为环境变量,使得环境变量能被bash识别到。
当我们使用export命令将环境变量导入到bash的环境变量表后,我们就可以通过代码的方式,使用getenv(name)来获得我们创建的环境变量。当使用getenv获取不存在的环境变量时,返回的是NULL。如下图:

当我们设置了环境变量时,当不想要时应该怎么删除呢?
我们可以使用unset+环境命令名 来取消环境变量,如下:

3.3环境变量的相关操作总结
1.echo: 显示某个环境变量值
2.export: 设置一个新的环境变量
3.env: 显示所有环境变量
4.unset: 清除环境变量
5.set: 显示本地定义的 shell 变量和环境变量
上述与环境变量有关的操作都是内存级的,不会影响到配置文件。如果要影响到配置文件需要使用vim打开并修改配置文件.bash_profile里面的内容:


![]()
然后,当我们关闭xshell后,重新登录对应用户,bash就会重新读取配置文件,包括我们创建的环境变量,然后输入env命令,就可以查看到我们之前创建的的环境变量了。

更多推荐


所有评论(0)