Linux--环境变量

一.基本概念

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

bash 复制代码
env

在Windows下的环境变量:

环境变量本质上也是一种变量,是一种键-值的对应关系,由变量命和变量值组成。

二.查看Linux下的环境变量

1.查看具体的环境变量

bash 复制代码
echo $NAME//NAME是环境变量名称

如:

常见的环境变量:

PATH

指定命令的搜索路径.

1.我们平时写的一些C/C++代码,编译成可执行程序后,通过 ./可执行文件名 运行可执行文件,而 ./ 的本质就是告诉操作系统可执行文件在那个路径(在那个目录里)

2.但是系统自带的指令,本质也是C语言写的程序,为什么系统的指令不需要 ./ 来指定的路径呢?

3.就是因为环境变量PATH的存在,在执行命令行上的程序时,操作系统会默认会在PATH上寻找。如程序在PATH的路径里,就输入 可执文件名 ,否则就必须输入 ./可执行文件名

注:PATH里面的路径以 / 为分隔符分离

HOME

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

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

普通用户的HOME

一般格式为 /home/用户名

root用弧的HOME

一般格式为:/root

4.SHELL

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

三.环境变量的组织方式

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

四.添加环境变量

用export导入环境变量

在创建一个本地变量并赋值,再用指令:

bash 复制代码
export 环境变量名

但是我们会发现一个问题,当我们把程序关闭启动后,再次查看环境变量时,会发现SD这个我们曾经导入的环境变量消失了,那么我们要如何才能导入一个关闭启动后,仍然存在的环境变量呢?

这里我们就不得不提,在我们登录时,我们的bash进程的环境变量表是如何来的,

在我们每次启动时,bash进程都会读取.bash_profile 配置文件中的内容,为我们bash进程形成一个一张环境变量表信息。因此要想导入一个程序关闭启动后,仍然存在的环境变量,我们就需要在.bash_profile文件里导入。

我们只需要在第8行之后添加我们在命令行导入环境变量的内容就行了。

五.环境变量的继承

1.环境变量是可以被子进程继承的。

2.子进程可以继承继承父进程的环境变量

3.但仅仅只是环境变量被子进程继承,本地变量不可以被子进程继承

六.获取环境变量

1.通过命令行第三个参数获取

这里先解释什么是命令行参数

先看代码:

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

解释:命令行参数,其实是一个字符串,会把命令行参数以空格作为分隔符分割,将分割后的字符串的首地址放入 argv中,而argc是分割的个数。

而main函数的第三个参数是一个指向环境变量表的指针数组 char* env[],我们可以通过数组下标,最后一个是NULL,来访问环境变量。

cpp 复制代码
#include<stdio.h>

int main(int argc,char* argv[],char* env[])
{
    for(int i=0;env[i]!=NULL;i++)
    {
        printf("%s\n",env[i]);
    }
    return 0;
}

注:

1.env是一个指针数组,记录的是每个环境变量的首地址。

2.证明环境变量可以被子进程继承

3.应证了环境变量的组织方式。

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

cpp 复制代码
#include<stdio.h>

int main()
{
    extern environ;
    for(int i=0;environ[i];i++)
    {
        printf("%s\n",environ[i]);
    }
    return 0;
}

注意:

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

3.通过系统调用getenv()

cpp 复制代码
#include<stdio.h>
#include<stdlib.h>

int main()
{
    char* a=getenv("PATH");
    printf("%s\n",a);
    return 0;
}

注意:

1.环境变量通常具有全局属性,可以被子进程继承

相关推荐
BUG 40432 分钟前
LINUX--shell
linux·运维·服务器
菜鸟小白:长岛icetea38 分钟前
Linux零基础速成篇一(理论+实操)
linux·运维·服务器
深海的鲸同学 luvi39 分钟前
【HarmonyOS NEXT】hdc环境变量配置
linux·windows·harmonyos
dowhileprogramming1 小时前
Python 中的迭代器
linux·数据库·python
过过过呀Glik1 小时前
在 Ubuntu 服务器上添加和删除用户
linux·服务器·ubuntu
Tesseract_95273 小时前
ioctl回顾
linux
Java小白中的菜鸟3 小时前
centos7的磁盘扩容
linux·运维·服务器
黑子哥呢?5 小时前
Linux---防火墙端口设置(firewalld)
linux·服务器·网络
F-2H7 小时前
C语言:指针4(常量指针和指针常量及动态内存分配)
java·linux·c语言·开发语言·前端·c++
aherhuo7 小时前
基于openEuler22.09部署OpenStack Yoga云平台(一)
linux·运维·服务器·openstack