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.环境变量通常具有全局属性,可以被子进程继承

相关推荐
孤客网络科技工作室7 分钟前
VMware 虚拟机使用教程及 Kali Linux 安装指南
linux·虚拟机·kali linux
颇有几分姿色1 小时前
深入理解 Linux 内存管理:free 命令详解
linux·运维·服务器
AndyFrank1 小时前
mac crontab 不能使用问题简记
linux·运维·macos
筱源源2 小时前
Kafka-linux环境部署
linux·kafka
算法与编程之美2 小时前
文件的写入与读取
linux·运维·服务器
xianwu5433 小时前
反向代理模块
linux·开发语言·网络·git
Amelio_Ming3 小时前
Permissions 0755 for ‘/etc/ssh/ssh_host_rsa_key‘ are too open.问题解决
linux·运维·ssh
Ven%4 小时前
centos查看硬盘资源使用情况命令大全
linux·运维·centos
TeYiToKu4 小时前
笔记整理—linux驱动开发部分(9)framebuffer驱动框架
linux·c语言·arm开发·驱动开发·笔记·嵌入式硬件·arm
dsywws4 小时前
Linux学习笔记之时间日期和查找和解压缩指令
linux·笔记·学习