0


【Linux杂货铺】环境变量


🌈前言🌈

    欢迎收看本期【Linux杂货铺】,本期讲解环境变量,在讲解环境变量之前,先简单了解命令行参数,其次展示常见的环境变量,以及相关命令集,讲解环境变量是如何工作等内容。

    讲解本期内容之前,你需要对进程有一定了解,如果你还不是很了解,可以看下面这篇博文,简单了解进程的基本概念。

【Linux杂货铺】进程的基本概念-CSDN博客

📁 命令行参数

📂 概念

**    C语言提供的一种可以给main函数传参的方式,支持写出可变选项的程序,即同一个程序通过不同选项定制出不同的功能。**

    在C语言学阶段,不知道你是否知道main函数可以有两个参数,可以带可以不带,不过之前很少用到。在学习玩环境变量后,可以知道main函数可以有3个参数,当然这是环境变量要讲的内容。

    下面展示一下前两个参数的是干什么的,包含了什么内容。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc,char* argv[])
{
    for(int i =0;argv[i] ; i++)                                                                                                                                     
    {
       printf("argv[%d] -> %s\n",i,argv[i]);
    }
    return 0;
}

    agrv就是一个字符指针数组,指向了命令行字符串的各个子字符串,子字符串是以空格为分隔符,数组最后一个元素时NULL。argc是字符串的个数。

📂 实现

    上图中,.myprocess是运行程序,就是启动一个进程,这个进程是bath进程的子进程(bath进程就是命令行解释器)。

    我们将命令行字符串输入给父进程bath,bath形成上图中字符串表,bath再将字符串传给子进程的两个参数。

    从而实现了通过命令行参数,实现进程的不同功能。

📂 功能

    命令行参数的本质就是交给程序不同选项,用来定制不同的程序功能。下面是演示效果。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main(int argc,char* argv[])
{
    if(argc != 2)
    {
      printf("Usage : %s -[a,b,c,d]\n",argv[0]);
    }
  
    if(strcmp(argv[1],"-a") == 0)                                                                                                                                     
    {
      printf("this is function1\n");
    }
  
    else if(strcmp(argv[1],"-b") == 0)
    {
      printf("this is function2\n");
    }
  
    else if(strcmp(argv[1],"-c") == 0)
    {
     printf("this is function3\n");
    } 
    else if(strcmp(argv[1],"-d") == 0)
    {
     printf("this is function4\n");
    }
    else
    {
     printf("no this is function1\n");
    }
    return 0;
}

    这样我们就可以理解在Linux中,所有的命令都是一个个可执行程序,通过不同选项来实现不同功能。

    例如,ls命令,ls命令就是一个可执行程序,不带参数可以查看文件;ls -a带上选项可以实现查看包含隐藏文件的所有文件。

📁 环境变量的基本概念

    环境变量(environment variables)一般是指**在操作系统中用来指定操作系统运行环境的一些参数。**

    环境变量通常具有某些特殊用途,在系统中通常**具有全局属性,因为环境变量本身会被子进程进程下去**。

📁 环境变量的存储

    最开始的环境变量不是在内存中的,而是在系统的对应配置文件中,即磁盘中。当我们启动系统,自己的bath进程会读取配置文件,拷贝配置文件里的内容到自己的上下文数据中。

   ** 因此,我们查看和修改的环境变量是内存级的**,即便修改覆盖删除也不会影响。重启后bath进程会重新拷贝配置文件。

  环境变量默认是在配置文件 ,如果我们修改了配制文件,那么就是不可逆的。

📁 常见的环境变量

● PATH : 指定用户的搜索路径;

● HOME : 指定用户的主工作目录(即用户登录到Linux系统中,默认的目录) ;

● SHELL : 当前shell,通常为/bin/bath;

** ** 这里我们就以PATH先讲解,什么是PATH?上文提到 ls命令就是一个可执行程序,为什么ls不用指定它的路径呢,而我们写出的可执行程序要指令路径呢?例如 ./myprocess 。

    ls命令是在 /usr/bin路径下,平时可以指定路径,也可以不指定,这是因为Linux系统中,存在一些全局设置,告诉命令行解释器,应该去哪些路径下寻找可执行程序。这个全局设置就是PATH

    bath在执行指令时,需要先找到命令,bath维护了PATH中的这些路径,会从PATH中的路径一个个去查找,如果找到,加载并运行这个程序,如果没有就报command错误。

📁 相关命令

📂 查看单个环境变量内容

echo $环境变量名

📂 设置新的环境变量

export $环境变量名=value

📂 显示所有环境变量

env

📂 清除环境变量

unset 环境变量名
    下图中我们添加了一个新的环境变量,在删除了这个环境变量。

📁 组织方式

    每个进程都会受到一个环境表,环境表就是一个字符指针数组,每个指针指向一个'\0‘结尾的环境字符串。

    这样就和我们之前的命令行参数所类似,父进程可以将环境变量表传给子进程。这样就理解了我们main函数可以有3个参数了,第三个参数就是指向环境变量表的指针数组。![](https://img-blog.csdnimg.cn/direct/c2dcf2e1e4c6488288c207de2a0e0643.png)

    总结一下,beth进程启动时,会默认给我们进程形成两张表:argv[]命令行参数表,从用户输入命令行,env[]环境变量表,从os配置文件来,bath通过各种方式传递给子进程。

📁 获取环境变量

📂代码获取

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main()
{
   extern char** environ;                                                                                                                                                                    
   for(int i=0;environ[i];i++)
   {
     printf("env[%d] -> %s\n",i,environ[i]);
   }
   return 0;
}

📂系统调用接口获取

    获得单个环境变量。

    导入一个环境变量![](https://img-blog.csdnimg.cn/direct/b33d6659195b4ad49172416108c266c8.png)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

int main(int argc,char* argv[],char* env[])
{
   char* path = getenv("PATH");
   if(path == NULL)
   {
     return 1;
   }
   printf("path : %s \n",path);                                                                         
   return 0;
}

总结一下,获取环境变量目前有3中方法:

  1. main函数传参的方式。

  2. char** environ

  3. 系统调用接口 getenv("环境变量名)

📁 总结

    以上,本期【Linux杂货铺】环境变量的主要内容了,包括了前置知识命令行参数,环境变量概念,环境变量的相关操作,以及理解环境变量是内存级的概念,存储配置文件中,介绍了3中获取环境变量的方法。

    如果感觉本期内容对你有帮助,欢迎点赞,收藏,关注Thanks♪(・ω・)ノ

标签: linux 运维 服务器

本文转载自: https://blog.csdn.net/jupangMZ/article/details/136818133
版权归原作者 秋刀鱼的滋味@ 所有, 如有侵权,请联系我们删除。

“【Linux杂货铺】环境变量”的评论:

还没有评论