【Linux】环境变量


一、什么是环境变量

环境变量指的是:当我们执行一条ls命令时,后面不需要跟该指令所在的路径,就可以直接执行。那为什么不需要跟呢?

背后就是有环境变量PATH,该变量存储这我们常见使用的命令的所在路径,当执行该命令时,操作系统会去默认PATH所给出的路径下查找是否有该指令。

总的来说,大部分环境变量就是路径。 但是,也有一部分环境变量是一些主机信息。
在xhell下,输入:env即可查看当前xhell的环境变量。
在这里插入图片描述

环境变量是一组name=value形式的变量,不同的环境变量有不同的属性,通常具有全局属性
有的环境变量不止一组name=value,如PATH,它后面的其他value值之间会用隔开。

1.getenv获取环境变量

先看下面一段代码:

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<stdlib.h>
  4 
  5 int main()
  6 {
  7     char who[32];
  8     strcpy(who,getenv("USER"));
  9 
 10     if(strcmp(who, "root") == 0)
 11     {
 12         printf("你是root用户,你可以做任何事情\n");
 13     }
 14 
 15     else
 16     {
 17         printf("你是普通用户,你受权限约束\n");                 
 18     }
 19 
 20     return 0;
 21 }

getenv函数是获取对应字符串的环境变量,比如上文,通过getenv(“USER”),获取到当前USER的环境变量,从而判断当前用户是谁。

当我在普通用户和root用户的环境下分别运行此代码时,结果如下:

在这里插入图片描述
为什么操作系统能识别到当前用户到底是谁,怎么做到的呢?

其实这就得益于getenv系统调用,来获取当前用户的环境变量,进而判断该用户是谁

1.main的命令行参数

为了更好理解环境变量,下面引出命令行参数的概念。

在main函数中,也是可以带参数的。

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

main函数的两个参数,就是命令行参数。

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

argc其实就相当于argv.size();

我们通过打印出main函数的参数,看看会发生什么。
在这里插入图片描述
执行了该程序后,可以发现:

argv数组存储的,都是我们输入的命令行!

在这里插入图片描述

实际上,bash命令行解释器会将 ./test -a -b -c -d -e这个字符串按照空格分隔开,每一个字符串就是一个命令行参数存放到argv[]数组中,而argc就是数组的元素个数。

那为什么main函数要这样设计呢?

为指令,工具,选项,等提供命令行选项的支持!!

可以看到,我们日常执行的ls,ls -a,ls -a -l等等,这些命令后面有些可以带参数,也可以不带参数。

正因为命令行具备选项等,所以main才要这样设计,来接收参数。

2.main的第三个参数

其实,main函数不止有两个参数,还有第三个参数:char* env[]
在这里插入图片描述

也就是说,还能通过main函数打印出环境变量出来。
在这里插入图片描述
main函数继承了程序所需要的环境变量。

环境变量具有全局性

因为子进程能够继承父进程的环境变量,所以在每个进程中都能读取到环境变量信息,这也就解释了为什么环境变量具有全局性!

3.子进程也会继承父进程的环境变量

如何证明子进程会继承父进程的环境变量?

我们就自己写一个环境变量, 看看子进程是否可以继承。

export MY_VALUE=12345678

通过export,将MY_VALUE这个自己写的环境变量导入,再打印出来,即可看到我们自己的环境变量:

在这里插入图片描述

此时,运行main函数,也能看到这个我们自己写的环境变量,就证实了环境变量可以被子进程继承,具有全局属性

结论:我们所运行的进程,都是子进程,bash进程本身在启动的时候,会从操作系统的配置文件中读取环境变量信息,子进程会继承父进程交给我的环境变量

4.取消自己设置的环境变量

自己写的环境变量可以取消掉:

unset MY_VALUE

此时就看不到自己写的环境变量在系统中了。

二、环境变量的用法

1.查看环境变量的方法

1)env
2)env | grep PATH ----查看PATH环境变量
3)echo $环境变量 (注意:如果是echo 环境变量,就无法查看到)

2普通变量和export导入

普通变量:只在bash内部有效,不会被子进程继承下来的变量。

在这里插入图片描述
这些就是普通变量。

普通变量只在bash进程内部使用,不会被子进程继承下来。

单纯设置普通变量,并不会被子进程继承下来,如果想要让子进程继承下来,还得将普通变量导入到环境变量中,方法还是使用export
export a=1,就能将一个普通变量导入到环境变量中,这样就会被子进程继承下来。

三、set查看所有环境变量

如何查到bash进程中的所有环境变量?

使用set命令

在这里插入图片描述

此时就看到我们刚刚设置的几个普通变量a,b,c,这些所有的变量中,如果不是普通变量, 那就是全局变量。

在这里插入图片描述

ps1就是对应下面的命令行待输入时的格式。

对于ps2,

在这里插入图片描述
输入ls \后,意思就是指令可以换行继续输入,就像c语言一样,代码可以换行继续输入。而那个>符号就是普通变量PS2。

所以,普通变量仍然有存在的意义,提供给bash内部使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

邓富民

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

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

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

打赏作者

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

抵扣说明:

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

余额充值