• 【Linux】命令行参数和环境变量


    命令行参数

    其实main函数是可以传参数的,也叫做命令行参数。我们这里先介绍main函数的前两个参数

    argc代表的是指针数组的元素个数,argv是一个指针数组,指针指向字符串。argv不可能为空,argv【0】存储该进程的名字

    例如 ls -a -l   那么argv就会存储ls,-a,-l,以空格为分隔符,argc则为3

    然后main函数可以通过字符串来进行映射分流,实现不同的功能

    命令行参数是让系统函数存在选项的重要概念

    我们也终于理解历史学的指令和选项是什么关系了   (指令里面含有main函数,将选项作为字符串传参,然后进行映射分流)

    环境变量

    学完上面的命令行参数后,我们发现在执行自己实现的指令的时候往往要加上./,而系统里的指令却不用,直接输入名字就好了,这是为什么呢?这里就和我们的环境变量有关系了

    要加上./是因为要让系统在当前目录中去寻找这个文件,不然的话系统找不到

    而系统的指令默认是在$PATH这个环境变量中去寻找的

    那么$PATH具体是什么呢?我们可以通过echo查看一下——echo $环境变量名

    可以看到本质上就是存储了一个个路径,以:为分隔符隔开

    除了PATH这个环境变量,系统中还有其他大量的环境变量

    例如 HOME——查看自己的家目录

            SHELL——查看当前SHELL

    每个环境变量都有自己的特定功能,任何进程在启动的时候都会获得命令行变量表和环境变量表

    环境变量是以什么形式存储的?

    本质上环境变量都为一个个字符串,所以我们用指针数组存储他们首元素的地址,就能找到对应的环境变量了,所以环境变量表本质上就是一个指针数组

    父子进程的环境变量从哪来?

    首先我们知道bash进程上的命令行(名义上的父进程)都是bash的子程序,子进程的命令行参数和环境变量都由父进程bash传递

    那我们的bash是如何在启动的时候就知道环境变量的呢?

    其实环境变量都存储在相关的配置文件中,bash启动的时候就会读取配置文件然后形成相关的环境变量表

    每个进程都有自己的环境变量吗,还是他们共享一份?

    父进程创建子进程的时候,会拷贝一份环境变量表给子进程,并将一些需要修改的信息进行修改(例如当前路径,用户名等),这样就实现了环境变量的全局性。所以每个进程都有自己的环境变量,而不是独享一份

    查看环境变量的三种方法

    1.通过main函数的第三个参数

    1. #include
    2. int main(int argc,char* argv[],char* env[])
    3. {
    4. //argc : 命令行参数的个数, 本质上就是argv数组的元素个数
    5. //argv :具体的命令行参数
    6. // envp : 环境变量的值
    7. for(int i=0;i
    8. {
    9. printf("%s\n",argv[i]);
    10. }
    11. for(int i=0;env[i]!=NULL;i++)
    12. {
    13. printf("%s\n",env[i]);
    14. }
    15. return 0;
    16. }

    2.通过第三方变量environ获取

    1. #include
    2. int main(int argc,char* argv[])
    3. {
    4. extern char** environ;
    5. for(int i=0;environ[i]!=NULL;i++)
    6. {
    7. printf("%s\n",environ[i]);
    8. }
    9. return 0;
    10. }

    libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时 要用extern声明 

    3.通过getenv()或者putenv()来访问特定的环境变量

    1. #include
    2. #include
    3. #include
    4. int main()
    5. {
    6. printf("%s\n",getenv("PATH"));
    7. return 0;
    8. }

    关于环境变量的一些指令

    1. echo: 显示某个环境变量值
    2. export: 设置一个新的环境变量
    3. env: 显示所有环境变量
    4. unset: 清除环境变量
    5. set: 显示本地定义的shell变量和环境变量

     这里看到可以用export设置新的环境变量,但是我们设置完后关掉shell再打开就会失效了,这是为什么呢?

    原因是这里export的只是一个本地变量,不会被继承,只存在当前进程中,而我们的环境变量本质上是去配置文件中读取然后形成的,所以关掉后本地变量会消失,而环境变量却依然可以使用

    如果真要修改环境变量,就要去修改相关的配置文件

    当PATH被设置为空的时候,为什么echo却能访问进程的本地变量呢?

    linux的两种命令

    1.常规命令:在磁盘中真实存在的,需要shell fork让子进程执行的——诸如ls,pwd...

    2.内建命令:shell命令行的一个函数,当然可以访问shell的本地变量

    常规命令需要shell创建子进程并去PATH中获取,但是此时PATH为空

    echo则是shell的一个函数,可以理解为父进程的函数,可以直接执行

    ———————————————————————————————————————————

  • 相关阅读:
    社区型商场、购物中心与会员管理
    2022年学Java开发的10个理由
    精通Linux,不清楚Telnet和SSH?
    【PTA刷题】请编写函数,求子串(详解+代码)
    SQL注入
    阿里云数据库大全_优惠活动_云数据库排行榜
    【数据结构-字符串 四】【字符串识别】字符串转为整数、比较版本号
    ShardingSphere打造高性能架构模式
    二叉搜索树的实现
    java图片生成
  • 原文地址:https://blog.csdn.net/fight_for1/article/details/133943781