【Linux】环境变量概念、作用、配置与修改详解

环境变量究竟是什么呢?它能给我们带来什么样的作用?该如何去配置和使用它呢?接下来为大家详解

目录

一、核心环境变量PATH

1.执行自己写的指令和系统指令的区别

2.给指令所在位置配置PATH环境变量

3.windows下是否也存在环境变量PATH?

二、其他环境变量

1.指令env查看环境变量

2.简单理解部分其他环境变量

SHELL:

HOME:

OLDPWD:

HISTSIZE:

三、环境变量与C/C++代码和进程的关系

1.用代码获取环境变量

[2.char **environ](#2.char **environ)

3.getenv(name)

四、环境变量具有全局性

五、内建命令

六、修改文件级环境变量


一、核心环境变量PATH

1.执行自己写的指令和系统指令的区别

之前我们经常会在vim编辑器下编写C语言代码并用Makefile自动化编译,并用./运行编译好的程序,如下

我们要运行code就要加"./",./是什么呢?其实就是code相对路径!"."就是当前目录,"./code"其实就是当前目录的code文件,告诉了操作系统(执行文件的是bash进程)要运行的文件在哪个路径下,如果我们不告诉OS要执行的文件的路径比如直接输code,会无法执行,因为操作系统找不到文件:

那既然如此,为什么我们平时常用的指令比如ls、top、pwd等等可以不加路径OS就能知道它们在哪呢???我们先看它们都在哪个路径下,可以用which指令查看:

显然都在/usr/bin的目录当中,如果我们想要不输入相对路径就可以执行code,我们也可以把它放到/usr/bin目录当中(要sudo提升权限)

这样子我们直接输入指令就可以运行了,但是,非常不建议这么做,因为这样会污染/usr/bin的指令池!!!

那我就是想既不污染指令目录也/可以直接执行我写的程序应该咋做?我们先搞懂为什么/usr/bin目录里面的指令可以直接执行,OS凭啥会找到这个路径?除了这个路径目录下的指令可以直接执行,还有没有其他路径的也可以?这就需要引出我们的核心环境变量PATH!

2.给指令所在位置配置PATH环境变量

PATH当中包含了OS会自己去找的所有路径,其中就包括/usr/bin路径,我们要查看PATH的内容,就要用指令:echo PATH,echo就是读取作用,而则相当于指针的解引用,得到指向的内容:

里面包含了许多路径,每个路径之间用冒号":"来分隔,其中一个路径就是/usr/bin,我们现在算是搞懂了为什么这些路径下的指令可以直接执行了,因为都被保存在了环境变量PATH中,那我们想要刚刚写的程序可以直接执行,是不是就可以把程序所在的当前路径加进PATH就行?是的没错,当前路径用pwd显示出来,然后直接加入PATH就行,注意是加入,不是覆盖,如果把之前的所有路径覆盖了会发生什么?

现在我们不小心用PATH直接等于当前路径了,再查看PATH,发现内容只剩下当前路径了,之前的/usr/bin都没有了,然后我们下面输入的指令比如ls -l(ll)、top都不能被OS找到并直接执行了!!!

那正确的加入路径的指令应该怎么写呢?这个稍后揭晓,因为现在最重要的问题是,我们原来的PATH内容如何恢复?难道忘记了内容是什么,我们的这些指令就永远用不了了吗?其实要恢复相当简单,只需要重启一下shell就行

重启后所有的路径全部恢复,这是因为环境变量PATH是属于OS文件级别的,而我们修改的都是内存级别的,在重启Linux后,PATH又会被重新设置为初始内容。

要正确地加入当前路径,用如下指令:

这样就可以将当前的路径加入到PATH环境变量当中了,这样就可以不加路径就可以直接运行code程序了:

但我们这些对环境变量的修改都是属于内存级别的,并不是系统文件级别的,因此只要重启linux,环境变量依旧会恢复原样。

3.windows下是否也存在环境变量PATH?

先给结论,windows下也是存在环境变量PATH的,我们可以通过控制面板查找环境变量

点击编辑用户环境变量,然后编辑这两个path即可

假设我们想要通过命令提示符控制面板直接打开APP(已下载),我们就可以找到该APP可执行文件exe所在的路径文件夹,然后将这个路径加入到path就可以了

二、其他环境变量

1.指令env查看环境变量

这里面展示了linux配置文件中所有的环境变量,包括PATH也在其中。

2.简单理解部分其他环境变量

SHELL:

当前shell,它的值通常是/usr/bash,用于记录当前用户默认使用的shell程序路径,它的作用就是告诉系统"用户默认用哪个shell解析命令",很多程序会依赖这个变量判断执行环境。

HOME:

指定用户的主工作目录,也俗称家目录,即用户登录到Linux系统中时默认的目录

这个环境变量涉及一个我们常用的指令,就是"cd ~",它能快速让我们从其他路径瞬间回到家目录,这个快捷指令就是基于HOME环境变量实现的

OLDPWD:

这个环境变量顾名思义,就是旧路径,也就是上一次我们所在的路径,基于这个环境变量也实现了可以回到上一个路径的快捷指令"cd -",比如刚才我们用"cd ~"回到了家目录,就可以用"cd -"回来

因为这个环境变量是要记录上一次的路径的,但是上一次的路径会因为我们的操作不断改变,因此它也是要实时变化的:

当我们在目前的day1路径的时候,OLDPWD就变成了家目录

当我们cd ~进入家目录的时候,OLDPWD又变成了day1目录的路径

因此它是会实时改变的

HISTSIZE:

当我们想要输入之前输入过的指令时,是可以通过按"上箭头的键盘按键"寻找的,避免重复输入过于麻烦,那为什么按这个按键可以寻找历史指令呢,原来它们都被保存了起来,但是保存数量又不可能无上限,因此环境变量HISTSIZE就是它的保存上限,我们来看看它有多大:

我们是可以保存3000个的,要想找到具体的历史指令,只用输入history即可查找

这里就会出现你之前输入的指令

还有许多环境变量这里就不一一讲解了,感兴趣的朋友可以通过大模型查找相关资料自行了解

三、环境变量与C/C++代码和进程的关系

1.用代码获取环境变量

根据上一篇的《命令行参数详解》的学习,我们可以知道main函数是有参数的,而且相当重要,当时我们讲解到的参数有argc和argv[]两个参数,这里再补充它的第三个参数env[]

通过上一篇《命令行参数详解》的学习我们知道了指针数组的最后一个是空指针,因此我们不必知道数组有多少元素,循环条件只要当前元素不为空即可,通过以上代码,就可以轻松得到所有环境变量,与Linux下的env指令的作用完全一致

2.char **environ

从刚刚的实验中可以清晰地感觉到env[]其实就是一张环境变量表,那么这第三个参数是谁传递过来的呢,其实就是char **environ,它指向环境变量表中的第一个环境变量,关系大概就是这样

我们看一下environ的信息(man environ)

它是包含在头文件unistd.h的全局变量。因此用代码获取环境变量,除了上面的那一种,还可以用environ来获取

3.getenv(name)

刚才的两种代码虽然可以获得所有环境变量,但是可能会有一个疑问,这些一获取就获取一大堆,我只想获取我们想要的行不行?当然没问题,只需要用getenv函数即可,参数就是要获取的环境变量名,如果没有该环境变量则返回NULL。

先来了解一下这个函数(man getenv)

我们通过下面代码来获取用户名

有了这个功能,我们可以写一个小小的伪"用户权限",比如只有特定用户才能执行某个程序,而这个特定用户由环境变量USER来判断

四、环境变量具有全局性

不同的环境变量,会有不同的应用场景,环境变量是具有全局性的,也就是在各进程之间通用,main函数中的env参数,本质上就是将环境变量表传递给进程!即使父进程创造了一堆子进程,但是由于父子进程的数据是可共享的,因此子进程也能看到环境变量表,子进程又创造子进程,环境变量表代代相传,因此环境变量是具有全局性的!

我的程序、命令等都是bash的子进程,而环境变量是默认在bash内部的,bash内部的环境变量又来自Linux系统的配置文件!而之前我们修改的环境变量都是内存级别的,它只是一个临时的环境变量表,重启Linux后它又会根据配置文件重新配置环境变量。

五、内建命令

系统既然存在这么多的环境变量,但也未必每个都对我们有用,那我们也可以根据自己的需求设置环境变量,也叫做内建命令

我们可以这样内建命令,但是我们可以发现,用echo指令它可以被打印出来,但是它不存在于env的环境变量表中,它属于本地变量,无法被子进程集成,不具备全局性,只有在bash内部可以访问!!!要将它加入到环境变量表中,我们还得要用export指令将它导出才行,下面我们export导出后并用代码验证它是否已经存在于环境变量表中

由此可以看到,当我们用export导出环境变量到表中之后,就可以查询到了,两种export的方式也在上图演示了,第一种是先设好TEST_ENV后再单独export,第二种是定义与export同时进行。

但是当我们重启Linux之后,我们设置的环境变量又全部消失了

和刚刚的情况一样,我们配置的这些环境变量都是在一张临时的表中,它只是内存级别的,而不是文件级别的,重启Linux后环境变量表又从配置文件当中拷贝一份出来,我们之前在临时表中配置的自然而然就不复存在了,如果我们非要让它们一直存在,就需要改变文件级别的配置,

六、修改文件级环境变量

Linux的环境变量配置文件就在家目录中,但它属于隐藏文件,需要ls -al才能显示

这两个就是配置文件,我们设置环境变量的最佳实践就在".bashrc"中修改:

保存退出后重启生效,我们查看它是否存在于环境变量表中

很显然我们成功了,而且往后无论重启linux多少次,它都会一直存在于环境变量表中,因为我们对它的文件级环境变量进行了修改!!!如果要改回来直接进去删除那条指令再重启即可。

今天的《环境变量详解》到此为止结束了,这个系列的知识都是前后连贯的,后面还会持续更新Linux的内容,感兴趣可以给博主一个三连喔~

相关推荐
r-t-H4 小时前
从零开始搭建CDH-第十二章
linux·hive·spark·centos·hbase
~黄夫人~4 小时前
零基础速通|Windows&Linux 常用命令行对照表大全
linux·运维·windows·笔记·备忘录·整理表格
benjiangliu4 小时前
LINUX系统-17-EXT系列文件系统(二)
linux·运维·服务器
杨云龙UP4 小时前
Linux 根分区被日志吃满?一次 58G Broker 日志清理实战_2026-05-20
linux·运维·服务器·数据库·hdfs·apache
络合白泽4 小时前
Debian 13 + NVIDIA Optimus 笔记本:从零配置 Wayland Explicit Sync 完整指南
运维·debian
ㄣ知冷煖★5 小时前
统一网关架构实践:从 Token 鉴权到路由、策略与凭证池转发全链路解析
java·服务器·架构
珠海西格电力5 小时前
零碳园区的碳排放指标计算的实操步骤
大数据·运维·人工智能·物联网·能源
叶半欲缺5 小时前
Linux通过lvm扩容根目录
linux·运维·服务器
utf8mb4安全女神5 小时前
Linux网络服务
linux·运维·服务器