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

相关推荐
HackTwoHub2 分钟前
可视化未授权访问批量探测工具、支持批量目标、并发扫描、SOCKS5 全局代理、CSV 导出
linux·windows·macos·网络安全·网络攻击模型
ACP广源盛1392462567317 分钟前
磐石 100 :IX6012 :ASM1812@ACP#国产 PCIe 2.0 交换芯片,轻量级算力扩展应用分享
大数据·linux·运维·网络·人工智能·嵌入式硬件·电脑
A-刘晨阳27 分钟前
K8s之负载均衡
linux·运维·容器·kubernetes·负载均衡
学困昇37 分钟前
彻底搞懂 Linux 基础 IO:文件描述符、重定向、dup2、缓冲区一次讲透!
linux·运维·服务器·开发语言·c++
xiaoye-duck1 小时前
《Linux系统编程》Linux指令 (三):从零开始理解Linux基础指令
linux
hecgaoyuan1 小时前
解决使用Nvidia Jetson Nano嵌入式系统远程桌面不能操作的问题
linux
Flynt2 小时前
Dirtyfrag漏洞:我花了一下午搞清楚这个Linux内核提权漏洞到底在搞什么
linux·运维·安全
量子炒饭大师2 小时前
【Linux系统编程】Cyberpunk在霓虹丛林中构建堡垒 —— 【关于 root 超级管理员权限】
linux·运维·服务器·root·uid
leaves falling2 小时前
Linux基础开发工具详解:从yum到gdb的完整指南
linux·运维·服务器
Mortalbreeze2 小时前
进程的概念
linux