Linux——环境变量

✅<1>主页::我的代码爱吃辣
📃<2>知识讲解:Linux——环境变量
☂️<3>开发环境:Centos7
💬<4>前言:环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数

目录

一.基本概念

二.Linux系统中常见的环境变量

1.查看指定的环境变量

2.PATH

3.HOME

4.SHELL

三.环境变量的组织方式

四.添加环境变量

五.环境变量的继承

六.获取环境变量

1.命令行第三个参数

2.通过第三方变量environ获取

3.通过系统调用获取或设置环境变量


7a61ce1356d74782994d4efa4c5c05a3.gif

一.基本概念

  • 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。
  • 如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
  • 环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性。

 查看当前LInux系统的环境变量:

指令:

env

3c10b182cd8d49d0b964814e3569eeee.png

windows下的环境变量:

89b89b26277c49bb90b2e0adae44a661.png

环境变量本质就是一种变量,一种K/V的对用关系,由变量名和变量值。

二.Linux系统中常见的环境变量

1.查看指定的环境变量

echo $NAME #NAME:环境变量名称

 例如:

f73757a50dec4c8cafe6e7e39870f1b3.png

2.PATH

指定命令的搜索路径.

  1. 我们平时写的一些C/C++代码,编译成可执行程序以后,通过 ./ 运行,本质是告诉操作系统可执行程序的位置。
  2. 但是系统自带的指令,本质也是C语言写的程序,为什么系统的指令不需要指定路径呢?
  3. 就是因为环境变量PATH里面存储了指定命令的搜索路径。

75ad94f3687b410480e5203e4426c503.png

3.HOME

指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)。

当我们每次登录系统的时候,系统就会记录下登录用户,并且填充HOME环境变量,并且创建bash进程帮我们执行 cd /home/XXX 的命令,进入我们自己的家目录,这就是我们为什么一进入系统,默认就在自己的家目录里。

普通用户:

40cb2a5877d040eaad31711f8e8a6dbe.png

root用户:

53ab012213b343babe2a9d6c4f4315c7.png

4.SHELL

当前Shell,它的值通常是/bin/bash。ab1c980112e04ee09ad78f623913692e.png

三.环境变量的组织方式

每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串,表的最后一个位置是NULL。

b0e6134e0e6d459dbb5a5524829c4d8f.png

四.添加环境变量

我们刚刚介绍了PATH环境变量,指定命令的搜索路径.那么我们可不可以将自己写的可执行程序的查询路径也添加进PATH里,这样我们的可执行程序,也可以实现不需要 ./ 就可以直接执行了。

测试代码:test.c

#include <stdio.h>
#include <unistd.h>

int main()
{
    int n = 3;
    while (n)
    {
        printf("原神启动:%d\n", n);
        sleep(1);
        n--;
    }
}

makefile:

ttest:test.c
	gcc -o $@ $^
.PHONY:clean
clean:
	rm -rf ttest

14a088b2f8bc4b799af7e50e0bb01065.png

 方法一:

使用export将我们该可执行程序的路径导入PATH中,后续可以不用加 ./ 就可以直接运行可执行程序,因为操作系统可知直接通过环境变量中的地址找到可执行程序。

export PATH=路径

ada3ad6f79ab43bd93ef8790e5b7f691.png

 注意:

这样会有一个很尴尬的问题就是我们的PATH中只有这一个路径了,即之前的TATH环境变量中的其他路径被我们导入的路径覆盖了。

我们这样导入环境变量:

export PATH=$PATH:路径

694a81209ea445ba808d1c1caa0ef537.png

方法二:

将可执行程序拷贝到 /usr/bin目录下,/usr/bin目录就是系统默认的命令存储的路径。

sudo cp ./ttest /usr/bin

e3ad4a1a670d46a295cea7b29e6ea865.png

本质将可执行程序放进/usr/bin目录下的过程,就是软件安装的过程。

上述这种添加变量的方式,就是将命令添加到系统环境中,还有一种添加变量的方式是将变量添加到本地,这种变量我们称之为本地变量。

例如:

hello=100

这就是添加了一个本地变量。

五.环境变量的继承

  1. 环境变量是可以被子进程继承的。
  2. 我们使用 export 导入的进程,就可以使用 echo 命令查询得到,echo 本质也是一个程序,之所以echo 可以查询到我们导入bash的环境变量本就是,echo 继承了bash的环境变量。
  3. 但是仅仅只是环境变量可以被子进程继承,本地变量是不可以子进程继承。

六.获取环境变量

1.命令行第三个参数

我们先看看命令行参数:

#include <stdio.h>
int main(int argc, char *argv[])
{

    int i = 0;
    for (i = 0; i < argc; i++)
    {
        printf("%s ", argv[i]);
    }
    printf("\n");
    return 0;
}

注意:

  1. argv是一个指针数组,数组每一个元素都是一个char*,每一个char*都指向了一个字符串。
  2. argc是argv数组的元素个数。

8407ea7cb1bf4ea7abc5056757fb469a.png

 注意:

  1. argv数组存储的就是我们命令行输入的以空格为分隔的字符串。
  2. 顺序是从左往右

 命令行的第三个参数:

测试代码:

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

运行结果:

496f368403354f68819c9ba752f29baf.png

注意:

  1. env也是一个指针数组,每一个数组元素存储的就是一个环境变量。
  2. 证明了环境变量是可以被子进程继承的。
  3. 应证了环境变量的组织方式。

2.通过第三方变量environ获取

 测试代码:

#include <stdio.h>
int main(int argc, char *argv[])
{
    extern char **environ;//环境变量表
    int i = 0;
    for (; environ[i]; i++)
    {
        printf("%s\n", environ[i]);
    }
    return 0;
}

运行结果:

e280833dafd3423f903c305a7ad851b8.png

 注意:

  • libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时 要用extern声明。

3.通过系统调用获取或设置环境变量

系统调用:

getenv()

502fc585063149a8b71ab0932172b34c.png

efe99ed2bc7d45c095fbadc968afcdf7.png

getenv参数是环境变量名,返回的是环境变量值字符串,如果没找到对应的环境变量,就返回NULL。

测试代码:

[wq@iZuf6hzw565sb02fomef99Z 23_9_12]$ HELLO=100#本地变量
[wq@iZuf6hzw565sb02fomef99Z 23_9_12]$ export MYHELLO=100#环境变量
#include <stdio.h>
#include <stdlib.h>
int main()
{
    if (getenv("PATH"))
    {
        printf("PATH:%s\n", getenv("PATH"));
    }

    if (getenv("MYHELLO"))
    {
        printf("MYHELLO:%s\n", getenv("MYHELLO"));
    }

    if (getenv("HELLO"))
    {
        printf("HELLO:%s\n", getenv("HELLO"));
    }

    return 0;
}

dc57dac148254096b1bc1703ab7666cc.png

2e3b14b87fd344c4a4e0ed702a59da45.png

 注意:

  1. 环境变量通常具有全局属性,可以被子进程继承下去。
  2. 我们之前说过本地变量不会被子进程继承,上面的代码也可以看出来。
  3. 但是为什么使用命令echo就可以查询到本地变量?因为echo是内建命令。

 

 

 

  • 56
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 52
    评论
评论 52
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

我的代码爱吃辣

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

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

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

打赏作者

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

抵扣说明:

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

余额充值