🌈前言🌈
欢迎收看本期【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中方法:
main函数传参的方式。
char** environ
系统调用接口 getenv("环境变量名)
📁 总结
以上,本期【Linux杂货铺】环境变量的主要内容了,包括了前置知识命令行参数,环境变量概念,环境变量的相关操作,以及理解环境变量是内存级的概念,存储配置文件中,介绍了3中获取环境变量的方法。
如果感觉本期内容对你有帮助,欢迎点赞,收藏,关注Thanks♪(・ω・)ノ
版权归原作者 秋刀鱼的滋味@ 所有, 如有侵权,请联系我们删除。