命令行参数和环境变量

发布时间:2026/5/26 16:49:47

命令行参数和环境变量 一、基本概念命令行参数是程序运行时通过命令行终端 / 控制台传入程序的额外参数用于在不修改代码的情况下动态配置程序行为比如指定输入输出文件、设置运行模式等。C 语言中main 函数支持两个参数来接收命令行参数是最经典的实现argcargument count参数个数包含程序名本身所以最小为 1argvargument vector参数数组字符串指针数组每个元素是一个命令行参数argv[0]程序本身的路径 / 名称比如 ./a.out 或 test.exeargv[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_ENV123456789。设置成功后会发现在输入env |grep TEST_ENV时找不到这个环境变量。但是输入echo $TEST_ENV却可以查看环境变量的内容。此时需要使用export TEST_ENV将该本地变量导出到环境变量表中这样才能被bash找到。这也就说明了环境变量和本地变量的区别本地变量只能在bash内部访问而不能在全局下访问。由于本地变量缺少全局性也就使得它不能被子进程所继承。如果想要全局下访问就得使用export命令。而export命令本质上就是把我们所设置的环境变量导入到环境变量表中将本地变量转化为环境变量使得环境变量能被bash识别到。当我们使用export命令将环境变量导入到bash的环境变量表后我们就可以通过代码的方式使用getenvname来获得我们创建的环境变量。当使用getenv获取不存在的环境变量时返回的是NULL。如下图当我们设置了环境变量时当不想要时应该怎么删除呢我们可以使用unset环境命令名 来取消环境变量如下3.3环境变量的相关操作总结1.echo: 显示某个环境变量值2.export: 设置一个新的环境变量3.env: 显示所有环境变量4.unset: 清除环境变量5.set: 显示本地定义的 shell 变量和环境变量上述与环境变量有关的操作都是内存级的不会影响到配置文件。如果要影响到配置文件需要使用vim打开并修改配置文件.bash_profile里面的内容然后当我们关闭xshell后重新登录对应用户bash就会重新读取配置文件包括我们创建的环境变量然后输入env命令就可以查看到我们之前创建的的环境变量了。

相关新闻