💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃个人主页 :阿然成长日记 👈点击可跳转
📆 个人专栏: 🔹数据结构与算法🔹C语言进阶🔹C++🔹Liunx
🚩 不能则学,不知则问,耻于问人,决无长进
🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍
文章目录
一、 什么是环境变量?
环境变量(environment variables):一般是指在操作系统在开机的时候帮我们维护系统运行时的一些动态参数。如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但
是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找
在Windows中,打开高级选项–环境变量便可以看到如下
但是有没有注意过,你每次配置环境变量,你是往系统变量的Path中加呢?还是用户变量。
环境变量的用户变量与系统变量的区别
- 我也是刚注意到这个问题哈哈,下面就是环境变量的用户变量与系统变量的区别
1、环境变量没有区分大小写,例如path跟PATH是一样的
2、系统变量对所有用户有效
3、用户变量只对当前用户有效
4、用户变量与系统变量,名称是变量,值是里面的内容,也就是通过变量存储了想要存储的内容,方便调用
5、系统变量与用户变量的PATH:告诉系统可执行文件放在什么路径(平常执行程序的路径,要放在PATH里面,不能建一个变量,cmd会提示“不是内部或外部命令,或者不是可执行程序”)
6、windows系统在执行用户命令时,若用户未给出文件的绝对路径,则首先在当前目录下寻找相应的可执行文件、批处理文件等;
7、若果当前目录找不到对应文件名的程序,在系统变量的PATH的路径中,依次寻找对应的可执行程序文件(查找顺序是按照路径的录入顺序从左往右寻找的,最前面一条的优先级最高,如果找到程序就停止寻找,后面的路径不再执行)
8、如果系统变量的PATH的路径找不到,再到用户变量的PATH路径中寻找(如果系统变量和用户变量的PATH中同时包含了同一个命令,则优先执行系统变量PATH中的命令)
9、每次新加了命令以后,要确定保存了。再重启CMD,否则命令不生效的。
10、在CMD里要输出环境变量 ECHO %变量名%
环境变量的本质其实还是变量,系统自己需要开辟空间,里面存放文件名和文件目录。开机时,自动启动
二、为什么要配置环境变量?
在Windows中:
在Windows命令行中,我们输入git
,便会显示相关信息,那系统
如何找到git所在位置的呢?
首先,我们知道git肯定是一个可执行文件,在windows下可执行文件都是以.exe
结尾的,那么我们就要找到它的路径在哪。然后将它的路径添加到系统环境变量中。这样,下次你直接输入git,系统也能找到git所在位置并执行。
如果不配置呢,就需要输入整个路径,同样可以执行。
在Linux中也是同理:
在Linux的学习中,我们make编译文件后,执行这个可执行文件时【./可执行文件
】。那你有没有想过为什么要加个./
呢?
- 这个
./
其实就是相对路径的意思,加上后也就相当于补全了路径去执行。 - 也可以将你的可执行文件路径加入到环境变量中,就只需要一个名字即可执行。
比较常见的环境变量有
PATH | 指定命令的搜索路径 |
---|---|
HOME | 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录) |
SHELL | 当前Shell,它的值通常是/bin/bash。 |
三、Linux中如何查看-获取当前环境变量?
1.使用echo $PATH查看
使用指令,查看当前环境变量
echo $PATH
PATH
:你的环境变量名称
系统中的环境变量有很多,以[:]来进行分割。其中便有/usr/bin
这个路径下就存在着我们经常使用的指令【ls】
所以,这下就懂了,为什么这些指令可以直接使用了吧。
四、下面再来学几个个获取环境变量的方法:
1、命令行第三个参数 char *env[]
#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;
}
这个env是一个指针数组,里面的每个都指向一个变量字符串
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;
}
为什么要声明?
extern char **environ;
libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中
,所以在使用时 要用extern声明。
- 来看看它的结构图
3、通过系统调用获取指定环境变量
指令:
getenv
格式:
char *getenv(const char *name)
作用:搜索 name 所指向的环境字符串,并返回相关的值给字符串
返回值:返回一个以 null 结尾的字符串,该字符串为被请求环境变量的值。如果该环境变量不存在,则返回 NULL。
#include <stdio.h>
#include <stdlib.h>
int main ()
{
printf("PATH : %s\n", getenv("PATH"));
printf("HOME : %s\n", getenv("HOME"));
printf("ROOT : %s\n", getenv("ROOT"));
return(0);
}
- 注意:这个指定并不是打所有变量。而是根据参数
name
来查找返回。
五、相关指令
- echo: 显示某个环境变量值
- export: 设置一个新的环境变量
- env: 显示所有环境变量
unset
: 清除环境变量set
: 显示本地定义的shell变量和环境变量
六、本地变量
本地变量就只能在当前进程使用
七、配置环境变量
那要怎么去将一个系统路径添加到【环境变量】中呢
- 这里要使用到一个关键字叫做
export
,然后将我们所要添加的路径放到其中即可
export PATH=/路径
🚩这里一定要主要覆盖问题,解决方法:
下图所示操作就会覆盖
环境变量,导致ls
指令找不到了
🔸解决重启Xshell就恢复了
1️⃣方法一:【>>】使用追加重定向
2️⃣方法二:使用【export
PATH=$PATH
:/路径
】(推荐)
关键字:export :export命令是Linux系统中的一个内置命令,用于设置或显示环境变量。通过export,我们可以
将变量从当前Shell传递到子进程的环境
中。
- 例如:我添加我的myproccess的路径到环境变量中
- 输入:
export PATH=$PATH:/home/lesson1/dir2
按照这个方法来运行的话再去查看环境变量就可以发现,这个路径被添加进去了,🌈而且并没有覆盖掉其他的内容:
- 再来执行一下看看
- 但是呢,当我们再去将服务器重启之后,再度运行这个可执行程序的时候,便可以发现我们之前添加的路径不见了。该怎么解决?
- 解决办法就是,通过修改
.bash_profile
配置文件。在文件中直接加入你要添加的环境变量即可。
另外还可以通过系统调用设置环境变量
putenv
八、环境变量的继承问题
环境变量通常是具有
全局属性
的,可以被子进程继承
下去
九、底层何如实现的
在每个用户目录下,都会存在一个【.bash_profile
】文件。通过执行这个文件,一层层找到所有环境变量。
- .bash_profile打开就是这样:在第四行其实又去
.bashrc
文件中找。 - 加自己的环境变量也是在这个文件中。
- 第四行中的【
.bashrc
】打开
- 又去/etc/bashrc文件中。这个就是配置文件了,它的内容很多。
所有的环境变量都是在这里来的
。