【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列


文章目录


前言

环境变量是操作系统和用户设置的一些动态键值对,为运行的程序提供配置信息。理解环境变量对于系统管理、软件开发都很重要。


一、环境变量的概念

环境变量是操作系统用来存储和传递与系统环境相关信息的一种机制,是以键值对形式定义的全局变量 ,供操作系统和应用程序读取和使用。

通常格式为:
当VALUE为多个时,以':'符号隔开

c 复制代码
KEY=VALUE
  • KEY:变量名
  • VALUE:对应值

那么它究竟有什么作用呢?我们来看这个例子:

从上面我们可以看到存在一个可执行程序test,第一次我们执行它,程序并没有正常运行,当然都知道因为没有指定程序所在路径,所以程序不能正常运行,第二次指定了不就运行成功了,那么我们的指令在执行时为什么不用指定路径呢?在指令篇我们就介绍过,指令的本质就是一个写好的可执行程序,当时我们说,如果我们想要让自己写的,可执行程序,像指令一样直接运行,我们可以将程序拷贝到指令所在路径下:/usr/bin

那还是没有解释为什么指令可以直接运行,或者说bash是如何找到指令的可执行程序的呢?还有没有其他方法可以使我们的可执行程序像指令一样运行呢?接下来我们来认识一下本篇第一个环境变量:PATH
PATH是操作系统中最核心的环境变量之一,当我们在命令行输入一个命令时,操作系统会按照PATH中定义的目录依次搜索该命令对应的可执行文件 ,若未找到该命令对应的可执行文件就会提示:command not found
查看PATH

c 复制代码
echo $PATH

PATH环境变量对应多个值,使用":"隔离开

所以当我们将自己写的可执行文件,拷贝到/usr/bin路径下,系统在PATH对应的目中就可以找到。

还有什么方法可以解决这里的问题呢?只需要将我们自己写的可执行程序所在路径添加到PATH环境变量中,不就也可以完成搜索了

bash 复制代码
PATH=$PATH:/home/ltn/dir



刚才的test于前面路径存在的,可执行程序重名了,所以又换了个程序给大家演示,但这恰恰说明了系统是从第一个路径向后搜索程序的。

我们使用which查找指令时,就是在PATH环境变量中搜索的,所以现在我们就可以像查找指令一样查找我们自己的可执行程序了。

二、常见的环境变量

环境变量 ... 作用 对应VALUE
HOME 当前用户的主目录路径 /home/ltn
USER 当前登录用户名 ltn
PWD 当前工作目录路径 /home/ltn
HISTSIZE 记录历史指令最大数 10000

查看环境变量:

查看所有环境变量:
env

查看指定环境变量:
echo $环境变量名

仅是截取的一部分

三、环境变量特点及其相关指令

为了方便接下来的讲解,我先带大家认识一个关于环境变量的系统调用接口:

头文件:#include<stdlib.h>
参数:环境变量名
返回值:如果存在则返回一个指向环境变量名的指针,否则返回NULL

3.1 环境变量的全局性

环境变量最开始是在我们登录xshell时,操作系统给bash形成的,当我们执行某些指令时,bash会创建子进程,并且将环境变量继承下来(当然会做某些修改),简单来说:环境变量是子进程从父进程那里继承下来的。
接下来我们验证一下!!!

创建我们自己的环境变量:

bash 复制代码
export ltn ="1234"

我们在当前bash进程定义了一个环境变量,如果子进程会继承父进程的环境变量,则可以打印出结果,否则程序什么都不输出。

c 复制代码
  1 #include<stdio.h>  
  2 #include<unistd.h>  
  3 #include<stdlib.h>  
  4 int main()  
  5 {  
  6   printf("子进程的ltn->%s\n",getenv("ltn"));                                                                                      
  7   return 0;                                           
  8 }

可以看到程序成功打印,所以子进程会继承父进程的环境变量。

3.2、环境变量的生命周期

  • 环境变量的生命周期与进程绑定
  • 进程终止时,环境变量也会被回收

正是有了继承的这种形式,我们之前所提到的权限概念,才会被每条指令遵守。
删除环境变量:

bash 复制代码
unset ltn

四、环境变量的组织方式

我们之前在学习的C语言,不知道你有没有听过main函数的参数:

c 复制代码
int main(int argc, char *argv[], char *env[])

第三个参数我们先不验证

c 复制代码
  1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<stdlib.h>
  4 int main(int argc, char *argv[], char *env[])
  5 {
  6   int i=0;
  7   for(;i<argc;i++)
  8   {
  9     printf("argv[%d]->%s\n",i,argv[i]);                                                                                           
 10   }
 11   return 0;
 12 }    

这样一段代码,当我们执行它时,结果会怎么样呢?

可以看到我们以上面两种不同的方式执行,程序打印出了两种不同的结果,要知道怎么会这样,我们还是要知道参数是什么意思:

参数一 argc

  • 作用:记录命令行参数的数量
  • 规则:
  • 1、argc的值至少为1,因为第一个参数始终是程序自身的名称。
  • 2、用户输入的每个参数(以空格分隔)都会增加argc的值。

参数二 argv

  • 作用:存储命令行参数的具体值(用空格分开的代表不同参数),以字符串数组的形式表示
  • 规则:
  • 1、argv[0] 是程序名称(可能包含路径,取决于调用方式)。
  • 2 、argv[1]argv[argc-1] 是用户输入的参数。
  • 3、 argv[argc] 是一个空指针(NULL),表示数组结束。

参数三、env

  • 作用 :指向系统的环境变量数组(从bash那继承的) ,每个元素是 KEY=VALUE 格式的字符串。

  • 规则

  • 1、 环境变量数组以 NULL 结尾。

  • 2、可以通过 getenv() 函数更安全地获取特定环境变量。

当知道了main函数的这些参数,我们就可以理解,为什么同一个指令加上不同的选项会有不同的功能了:当你在执行指令是带上不同参数,它就会存入到argv数组中,然后通过if else语句匹配不同代码块。实现不同功能。

五、C语言对环境变量的操作

5.1 设置环境变量:setenv


头文件:#include<stdlib.h>
参数:

  1. name:设置的环境变量名
  2. value:设置的环境变量值
  3. overwrite:是否覆盖已有值(非零表示覆盖)

示例:

c 复制代码
    1 #include<stdio.h>
    2 #include<unistd.h>
    3 #include<stdlib.h>
    4 int main(int argc, char *argv[], char *env[])
    5 {
    6   if(setenv("ltn","Hell Linux",0)==0);
    7   {
    8     printf("ltn set to->%s\n",getenv("ltn"));                                                                                   
    9 
   10   }
   11   return 0;
   12 }

5.2 删除环境变量:unsetenv

头文件:#include<stdlib.h>
参数:

  1. name:环境变量名

示例:

c 复制代码
    1 #include<stdio.h>
    2 #include<unistd.h>
    3 #include<stdlib.h>
    4 int main(int argc, char *argv[], char *env[])
    5 {
    6   if(setenv("ltn","Hell Linux",0)==0);
    7   {
    8     printf("ltn set to->%s\n",getenv("ltn"));
    9 
   10   }
   11   unsetenv("ltn");                                                                                                              
   12   printf("ltn->%s\n",getenv("ltn"));                                                                       
   13   return 0;                                                                                                
   14 }  


创建好,并删除

5.3 遍历所有环境变量:environ


environ是一个全局变量,内部存有所有环境变量的指针,,末尾指针指向NULL,具体介绍太长,不方便展示,大家可以自己看。
示例:

c 复制代码
    1 #include<stdio.h>
    2 #include<unistd.h>
    3 #include<stdlib.h>
    4 extern char**environ;
W>  5 int main(int argc, char *argv[], char *env[])
    6 {
    7   char **env1=environ;
    8   while(*env1)
    9   {
   10     printf("%s",*env1);
   11     env1++;                                                                                                                     
   12   }
   13 
   14   return 0;
   15 }


仅截取部分打印结果

下面我们来说一下第三给参数,第三参数,是一个环境变量数组,也就是说,我们可以通过直接变量得到全部环境变量:

c 复制代码
    1 #include<stdio.h>
    2 #include<unistd.h>
    3 #include<stdlib.h>
    4 extern char**environ;
    5 int main(int argc, char *argv[], char *env[])
    6 {
    7   int i=0;
    8   while(env[i])
    9   {
   10     printf("%s\n",env[i]);
   11     i++;                                                                                                                        
   12   }
   13 
   14   return 0;
   15 }


本篇就先到这里,看完给个三连吧!!!

相关推荐
bubiyoushang8882 小时前
Windows11 WSL2 Ubuntu编译安装perf工具
linux·运维·ubuntu
行云流水剑3 小时前
【学习记录】使用 Kali Linux 与 Hashcat 进行 WiFi 安全分析:合法的安全测试指南
linux·学习·安全
xuanwojiuxin3 小时前
linux panic-propagation
linux·运维·服务器
achene_ql5 小时前
select、poll、epoll 与 Reactor 模式
linux·服务器·网络·c++
藥瓿亭5 小时前
K8S认证|CKS题库+答案| 9. 网络策略 NetworkPolicy
linux·运维·docker·云原生·容器·kubernetes·cks
千千寰宇5 小时前
[数据传输/网络传输/序列化/计算机组成原理] 字节序/大小端
linux·计算机组成原理/硬件/半导体
LFloyue6 小时前
Linux离线(zip方式)安装docker
linux·docker
Blue桃之夭夭6 小时前
深入理解Optional:处理空指针异常
linux·windows·microsoft
什么半岛铁盒7 小时前
Linux线程与进程关系及底层实现
java·linux·运维
简朴-ocean8 小时前
如何删除linux空的文件夹
linux·运维·服务器