详解Linux中常见环境变量的特点与设置

 更新时间:2025年06月10日 11:59:34   作者:什么半岛铁盒  
环境变量是操作系统和用户设置的一些动态键值对,为运行的程序提供配置信息,理解环境变量对于系统管理、软件开发都很重要,下面小编就为大家详细介绍一下吧

前言

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

一、环境变量的概念

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

当VALUE为多个时,以‘:’符号隔开

KEY=VALUE
  • KEY:变量名
  • VALUE:对应值

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

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

那还是没有解释为什么指令可以直接运行,或者说bash是如何找到指令的可执行程序的呢?还有没有其他方法可以使我们的可执行程序像指令一样运行呢?接下来我们来认识一下本篇第一个环境变量:PATH

PATH是操作系统中最核心的环境变量之一,当我们在命令行输入一个命令时,操作系统会按照PATH中定义的目录依次搜索该命令对应的可执行文件,若未找到该命令对应的可执行文件就会提示:command not found

查看PATH:

echo $PATH

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

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

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

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会创建子进程,并且将环境变量继承下来(当然会做某些修改),简单来说:环境变量是子进程从父进程那里继承下来的。

接下来我们验证一下!!!

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

export ltn =”1234“

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

   #include<stdio.h>  
   #include<unistd.h>  
   #include<stdlib.h>  
   int main()  
   {  
     printf("子进程的ltn->%s\n",getenv("ltn"));                                                                                      
     return 0;                                           
   }

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

3.2、环境变量的生命周期

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

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

删除环境变量:

unset ltn

四、环境变量的组织方式

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

int main(int argc, char *argv[], char *env[])

第三个参数我们先不验证

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

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

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

参数一 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>

参数:

name:设置的环境变量名

value:设置的环境变量值

overwrite:是否覆盖已有值(非零表示覆盖)

示例:

     #include<stdio.h>
     #include<unistd.h>
     #include<stdlib.h>
     int main(int argc, char *argv[], char *env[])
     {
       if(setenv("ltn","Hell Linux",0)==0);
       {
         printf("ltn set to->%s\n",getenv("ltn"));                                                                                   
     
      }
      return 0;
    }

5.2 删除环境变量:unsetenv

头文件:#include<stdlib.h>

参数:

name:环境变量名

示例:

     #include<stdio.h>
     #include<unistd.h>
     #include<stdlib.h>
     int main(int argc, char *argv[], char *env[])
     {
       if(setenv("ltn","Hell Linux",0)==0);
       {
         printf("ltn set to->%s\n",getenv("ltn"));
     
      }
      unsetenv("ltn");                                                                                                              
      printf("ltn->%s\n",getenv("ltn"));                                                                       
      return 0;                                                                                                
    }  

创建好,并删除

5.3 遍历所有环境变量:environ

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

示例:

     #include<stdio.h>
     #include<unistd.h>
     #include<stdlib.h>
     extern char**environ;
     int main(int argc, char *argv[], char *env[])
     {
       char **env1=environ;
       while(*env1)
       {
        printf("%s",*env1);
        env1++;                                                                                                                     
      }
    
      return 0;
    }

仅截取部分打印结果

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

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

以上就是详解Linux中常见环境变量的特点与设置的详细内容,更多关于Linux环境变量的资料请关注脚本之家其它相关文章!

相关文章

  • ubuntu 16.04 64位兼容32位程序三步曲

    ubuntu 16.04 64位兼容32位程序三步曲

    这篇文章主要介绍了ubuntu 16.04 64位兼容32位程序的三步,本文分步骤给大家介绍的非常详细,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2019-06-06
  • Linux系统下快速配置HugePages的完整步骤

    Linux系统下快速配置HugePages的完整步骤

    这篇文章主要给大家介绍了关于如何在Linux系统下快速配置HugePages的完整步骤,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • Linux tr命令的使用

    Linux tr命令的使用

    这篇文章主要介绍了Linux tr命令的使用,帮助大家更好的理解和学习Linux,感兴趣的朋友可以了解下
    2020-08-08
  • 详解Linux time 命令的使用

    详解Linux time 命令的使用

    这篇文章主要介绍了详解Linux time 命令的使用,帮助大家更好的理解和学习linux,感兴趣的朋友可以了解下
    2020-08-08
  • linux expect 自动登录交换机保存配置的方法

    linux expect 自动登录交换机保存配置的方法

    今天小编就为大家分享一篇linux expect 自动登录交换机保存配置的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • Linux下配置IP的三种实现方式

    Linux下配置IP的三种实现方式

    本文介绍了Linux系统中配置IP的三种方法:使用nmcli命令、ip命令以及通过ifcfg文件,nmcli命令是NetworkManager的命令行工具,配置后不会丢失;ip命令配置后重启系统会丢失;ifcfg文件配置需手动激活
    2024-11-11
  • centos 6.5 oracle开机自启动的环境配置详解

    centos 6.5 oracle开机自启动的环境配置详解

    这篇文章主要介绍了centos 6.5 oracle开机自启动的环境配置详解的相关资料,需要的朋友可以参考下
    2017-01-01
  • 关闭linux终端还让程序继续执行的实现方式

    关闭linux终端还让程序继续执行的实现方式

    这篇文章主要介绍了关闭linux终端还让程序继续执行的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 不允许错过的Linux常用命令集合

    不允许错过的Linux常用命令集合

    不允许错过的Linux常用命令集合,实用的Linux常用命令,很全面,感兴趣的小伙伴们可以参考一下
    2016-01-01
  • linux命令行之linux快速搜索历史命令方式

    linux命令行之linux快速搜索历史命令方式

    这篇文章主要介绍了linux命令行之linux快速搜索历史命令方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11

最新评论