【Linux】环境变量与main()函数参数
1、基本概念
环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数。(如当我们编写c/c++代码的时候,在进行链接的时候,我们从来不知道动静态库在哪里,但是照样可以链接成功生成可执行文件,原因就是有相关环境变量帮助与编译器进行查找。)
1.1命令行参数(main()函数参数)
main()函数是函数唯一入口,但是main()函数有参数吗?
在平时写代码的时候我们一般都是在main()函数中调用其他函数,几乎没有在main()函数里面传入过参数,但是其实main()函数也是有参数的,只不过我们平时代码都才用了main()函数的无参版本(int main(void)),但是main()函数参数有哪些?给main()函数传入参数有什么用呢?
命令行参数有哪些
按照 C/C++ 的官方标准定义,main()函数的合法带参形式仅有一个:int main(int argc, char *argv[]),包含两个参数:argc 和 argv,二者的核心作用是接收并处理程序运行时传入的命令行参数。
值得注意的是,argc和argv是唯一被纳入官方标准的main函数参数;而env作为第三个参数,属于编译器的语法扩展特性(非标准),主流编译器均支持该写法,它的作用是让程序直接获取操作系统的全部环境变量。
命令行参数有什么用
argc和argv参数
为了更加直观地看到main()函数前两个参数实际作用,我们可以用以下简单代码进行实践:
#include<stdio.h>
int main(int argc , char *argv[])
{
for(int i=0 ; i<argc ; i++)
{
printf("argv[%d]is %s\n",i,argv[i]);
}
return 0;
}
我们对其进行编译生成可执行文件并在命令行输入图示命令进行执行:

发现程序输出了四行信息,对比我们之前的概念和代码内容可以看到,当我们输入指令执行程序时,程序将我的指令以空格为分隔符分成了四部分并且输出,同时也不难看出argc自动被赋值为了4。此时不难联想到平时我们使用的各种带选项指令,如ls -a -l等等,他们也通过C语言编写,通过这种原理来实现了不同选项执行不同功能的效果。总的来说,这中main()函数带参数的形式让我们能够轻易实现一个程序执行不同功能的效果。
2、env参数(环境变量)
在讨论这个参数前,我先抛出一个问题:为什么我们在执行ls、pwd、cd等等指令的时候,同样作为程序,他们为什么不需要用./前缀进行执行,而自己写的程序执行却需要./前缀 ?
其实这个问题也很好想:当我们要执行某个程序,最重要的肯定是先找到该程序的路径,那意思是ls、pwd、cd等等这些指令操作系统就能很快获取相应路径吗?是的,这些指令被存在特定路径并且保存在环境变量中。而当我们在命令行输入一个只写名字的指令时,操作系统会在环境变量保存的特定PATH中进行查找,当找不到的时候,bash就会进行报错:command not found,而我们自己写的程序默认不在PATH路径下,因此不加./前缀就会出现报错。按照这个逻辑,我们将自己编写的程序放在usr/bin/路径下,(该操作需要root权限),或者在环境变量修改path路径为程序所在路径即可不带./前缀进行程序执行。(建议不要覆盖式修改,可使用PATH=$PATH:【路径】进行路径添加(上述操作均为临时修改,可以重连服务器进行复原)),如果需要永久修改,则需要通过修改配置文件实现,这里不作过多讲解。
那么env参数具体是什么呢?
调出env参数有很多办法,比如我们可以通过C语言代码或者linux自带函数进行调取:
C语言实现:
#include<stdio.h>
int main(int argc , char *argv[],char *env[])
{
for(int i=0 ; env[i] ; i++)
{
printf("%s\n",env[i]);
}
}
我们对代码进行编译并且运行,可以看到:

这样就调出了操作系统的环境变量
或者在命令输入env同样可以直接调出环境变量,那么查阅环境变量表,我们可以读出很多信息:比如PWD路径,这也解释了为什么我们输入pwd指令bash可以打印出我们的当前路径,因为环境变量中会对PWD路径进行记录。
HOME路径,它的作用也不言而喻,当我们输入cd ~指令时,我们就会准确的转入到我们的用户家目录下,其同样离不开我们的环境变量。
总之,环境变量为我们提供了很大的便利,是操作系统中不可或缺的一张表。那么其在程序设计main()函数参数中作用在哪里体现呢?
我们在环境变量中看到很多参数都是和登录用户绑定的,所以,基于此发现,我们可以利用环境变量做一个只有某用户才可以运行的程序,当然这只是其一,其他还有很多用法。
环境变量的添加与删除方法
环境变量的修改分为临时生效和永久生效两种方式,均无需 root 权限即可完成自身的环境变量配置。临时添加环境变量,执行命令 export PATH=$PATH:/自定义目录路径 即可,该配置仅对当前终端有效,重新连接服务器或关闭终端后会自动恢复系统默认。临时删除环境变量可执行 unset 变量名,例如 unset PATH 可清空当前终端的 PATH 配置,同样仅临时生效。若需要永久添加环境变量,将 export PATH=$PATH:/自定义目录路径 这条命令写入当前用户家目录下的 .bashrc 文件中,执行 source ~/.bashrc 命令即可让配置立即生效,后续重新连接服务器也不会失效。如需永久删除自定义的环境变量,只需编辑 ~/.bashrc 文件,删除文件中对应的环境变量配置语句,再执行 source ~/.bashrc 即可恢复系统原始的环境变量配置。我们可随时通过 echo $PATH 命令,查看当前环境变量的完整配置内容。
总结
env 参数里的初级环境变量都是系统预设的基础配置,核心几个简单说:PATH是系统查找可执行程序的目录列表,ls 等指令的目录在其中所以不用./;HOME是当前用户的家目录,~就是它的简写;USER记录当前登录用户名;PWD是终端当前所在目录。这些变量就像系统的基础说明书,程序读取它们就能获取系统和用户的关键信息。
而经过这个知识点学习,我们也可以看出,main()函数中可以传入参数,而我们从来没有自己写过main()函数的调用函数,那么main()函数想要运行肯定也会被其他函数调用,这也印证了一个底层真相:Linux 中所有可执行程序的真正入口函数都不是 main (),而是_start 函数,main () 只是 C/C++ 编译器为我们封装的应用层入口,gcc 会自动链接启动代码,由_start 调用 main ();而 ls、pwd 这类系统指令,很多都是直接基于_start 开发,效率更高。
更多推荐



所有评论(0)