linux系统的环境变量-搞清环境变量到底是什么

引例

在linux系统中,我们使用ls命令,直接在命令行中输入ls。即可列出当前目录内容。我们可以在/usr/bin/目录下找到ls的可执行文件。如下图:

在这里插入图片描述

看一看下面这种情况:
在这里插入图片描述
为什么上面两个"不同"命令实现的功能一样呢?
原因就是环境变量搞的鬼!因为我们平常输入的ls本质上其实就是该目录下的可执行文件。我们输入ls时,命令行通过“环境变量里的路径”自动帮我们找到了该文件!

为了验证这种情况?我们查看以下当前的环境变量:

echo $PATH

在这里插入图片描述
可以看到当前环境变量里面有==/usr/bin/==该路径,我们输入ls时,自动会根据路径去找相关可执行文件。

环境变量

一般是指在操作系统中用来指定操作系统运行环境的一些参数。环境变量通常具有某些特殊的用途,并且通常具有全局属性。

常见的环境变量

  • PATH:指定命令的搜索路径
  • HOME:指定用户的主工作目录
  • SHELL:当前Shell,通常是/bin/bash

echo

查看环境变量
echo $环境变量名

如下例子:

echo $PATH && echo $HOME
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/xty/.local/bin:/home/xty/bin
/home/xty

export

修改环境变量
用法:export PATH=
相当于赋值操作,使用:分割开。

示例:

export PATH=$PATH:/home/xty/cplusplus/linux/1027
解释:将PATH修改为$PATH(原来的环境变量)+自己新设置的路径。(注意路径中不能有. 否则会当成当前路径)

在这里插入图片描述

而该路径下有一个可执行文件,即我们自己写的c语言文件。

在这里插入图片描述
以前我们需要如上面执行自己的文件,而现在我们不需要这样了。
见证奇迹的时刻!如下所示:
在这里插入图片描述
我们仅仅输入文件名即可运行该程序,这就是环境变量的作用!

env

显示所有环境变量

unset

删除变量或函数
unset [-选项] 名字
f:函数
v:变量
在这里插入图片描述

set

显示本地定义的shell变量和环境变量。

通过代码获取环境变量

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

第一个参数:代表传入命令行参数的个数。
第二个参数:存储着指向命令行参数的指针。大小为argv
第三个参数:储存着系统的环境变量。

使用第三个参数获取

    1 #include<stdio.h>
    2 
    3  //通过第三个参数获取环境变量。
    4 int main(int argc, char *argv[], char *env[])                                                                                                                         
    5 {
    
    
    6   printf("begin.............\n");
    7 
    8   int i;
    9   for(i = 0; env[i]; i++)
   10   {
    
    
   11     printf("env[%d]:%s\n",i,env[i]); // 打印环境变量
   12   }
   13 
   14   printf("end.................\n");
   15 
   16 
   17 
   18   return 0;
   19 }

使用全局变量enviorn获取环境变量

在这里插入图片描述
如上图,这些环境变量存在environ中,存的是指向环境变量的指针。
示例:使用全局变量也可以获得环境变量。

    1 #include<stdio.h>
    4 int main(int argc, char *argv[])                                                                                                                                      
    5 {
    
    
    6   printf("begin.............\n");
    7 
    8   extern char **environ;//声明全局变量
    9   int i = 0;
   10   for(; environ[i];i++)
   11   {
    
    
   12     printf("%s\n",environ[i]);
   13   }      

通过系统调用获取环境变量

系统调用函数
getenv(环境变量名称)

运行示例:

    1 #include<stdio.h>
    2 #include<stdlib.h>
    4 int main(int argc, char *argv[])
    5 {
    
    
    6 
    7   printf("%s\n",getenv("PATH"));
    8   printf("%s\n",getenv("HOME"));                                                                                                                                      
    9 	return 0;
   10 }
  
  //输出结果
  /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/xty/.local/bin:/home/xty/bin
/home/xty

环境变量具有全局属性

  • 子进程可以继承父进程的父进程的环境变量。
    例子:为什么我们能通过char *env[],获取环境变量?
    因为我们写的test程序是由父进程(bash)创建的,那些环境变量都是父进程(bash)的,子进程给继承过来了,表面上我们什么都没传,实际上父进程给我们自动传过来了。

  • 环境变量具有全局属性。
    通过export设置的环境变量都具有全局属性。
    看一下代码:

    1 #include<stdio.h>
    2 #include<stdlib.h>
    4 int main(int argc, char *argv[])
    5 {
    
    
    6 
    7   printf("%s\n",getenv("XTYY")); //获取XTYY环境变量
    8 
    9   printf("\n");                                                                                                                                                       
   10 }

起初我没有设置XTYY环境变量,我们什么也没有得到。后来我通过export设置后,再次运行程序,发现获得了环境变量。因此可以证明环境变量具有全局属性。
在这里插入图片描述

main函数前两个参数的作用

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

第一个参数:代表传入命令行参数的个数。
第二个参数:存储着指向命令行参数的指针。大小为argv

有一段示例程序可以解释这些参数的作用,
示例一:

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<stdlib.h>
  4 #include<unistd.h>
  5 
  6 
  7 
  8 int main(int argc, char *argv[])
  9 {
    
    
 10   if(argc != 2)
 11   {
    
    
 12     printf("Usage: %s 至少要有一个选项\n", argv[0]);
 13     return 1;
 14   }
 15 
 16   if(strcmp("-a", argv[1]) == 0)
 17   {
    
    
 18     printf("这是功能一\n");
 19   }
 20   else if(strcmp("-b", argv[1]) == 0)
 21   {
    
    
 22     printf("这是功能二");
 23   }
 24 
 25   return 0;                                                                                                                                                             
 26 }
 27 

在这里插入图片描述
通过上面的例子我们可以看出,执行程序后,命令行的选项,被存到了argv的数组中,从而实现不同功能的作用。

示例二:

  8 int main(int argc, char *argv[])
  9 {
    
    
 10   printf("argc = %d\n",argc);
 11 
 12   int i = 0;
 13   for(; i<argc; i++)
 14   {
    
    
 15     printf("%s ",argv[i]);
 16   }
 17   printf("\n");                                                                                                                                                         
 18 }

在这里插入图片描述

可以看出,argc代表着选项的数量;argv[0],代表命令;其余代表选项。

以上就是环境变量相关知识,后续还会继续补充,请期待。

猜你喜欢

转载自blog.csdn.net/weixin_45153969/article/details/134083475