【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个参数了,第三个参数就是指向环境变量表的指针数组。

        总结一下,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;
}

📂系统调用接口获取

        获得单个环境变量。

        导入一个环境变量

#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♪(・ω・)ノ

  • 65
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 20
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋刀鱼的滋味@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值