前言
不知道大家有没有过这样的经历,你再Windows上安装了一个软件,这个软件提示你将环境变量设置进path中,比如说我们耳熟能的python。那么你有没有好奇环境变量到底是个什么东西,他在我们的计算机上起到了一个什么样的角色?
一、环境变量引入
例1:在Windows中我们都见过这样一个“黑框框”,这个东西叫做终端,我们可以在这个里面输入一些指令它会根据我们输入的内容来做出相应的相应。“ls” 命令的含义是显示当前目录下的所有文件,我们不难得知其实ls也应该是一个可执行程序,当我们执行这个可执行程序的时候,他就会给我们输出相应的结果。但是你是不是觉得它和我们平常自己的程序执行有些不一样。
例2:我们在命令行中也可以运行我们的程序也可以得到相应的结果。
我们不难发现我们执行我们自己写的程序时,需要除了需要指明我要执行的文件名以外,还要指明该可执行文件的目录位置,显然图2中可执行文件的所在目录就是当前目录。
1.如何证明"ls"是一个可以执行程序呢?
我们使用“which”指令,它可以帮助我们找到“ls”可执行程序所在的路径
我们可以使用“ls”命令展示以下该文件夹中的内容,但是这个文件中保存着大量的文件我们使用“grep”指令过滤一下
我们使用"./ls"运行一下,看看它和我们熟知的ls命令是否是同一个东西。
通过该图片我们不难发现两次结果是完全相同的。那么我们也就可以证明“ls”是一个文件,我们可以执行这个文件来得到对应的输出结果。
2.为什么ls不需要指定路径就能运行
我们知道要想执行一个可执行程序就必须要指明路径,但为什么ls就不用指明呢?那一定是有人为我们做了指明路径的这个事情,那么这个人是谁呢?他就是我们的一个环境变量PATH,我们可以使用如下命令行格式来查看某一特定的环境变量
echo $[环境变量的名称]
其中保存检索路径信息的环境变量名叫做PATH
我们从中就查看到了保存ls指令的路径。
所以如果我们想让我们自己写的程序直接就可以执行不需要指明路径,我们现在就有两种办法了
①将生成的可执行文件移入PATH环境变量所包含的文件夹中。
②修改PATH换将变量,将自己的工作目录加到PATH中。
顺带一提,如果想要恢复PATH,由于我们的操作都是对内存中的PATH进行操作,而不是对文件中的PATH操作,我们可以直接退出云服务器/虚拟机的客户端,等待下一次登陆时,bash会重新启动, 重新启动bash就会重新读取PATH的配置文件,PATH就会恢复到配置文件中的状态。
二、环境变量是什么
现在我们可以稍微理解一点环境变量的意义了,但是要说明的是环境变量不是一个,而是一堆,我们如果想要查看Linux中的环境变量的话,可以使用“env”指令来查看。
所以环境变量其实就是类似于编程语言的变量,采用一对一方式来进行存储的,当程序运行时载入内存中的一堆变量而已,只不过这些变量是在为我们这个正在运行的命令行进程服务的而已。 我们也可以对环境变量进行内存级的修改。
我们也可以通过指令删除内存级的环境变量
我们刚刚也提到过内存级环境变量的修改是会随着进程的关闭而消失的,如果我们想将这个变量永久的启用或删除就必须进行文件级的修改。
比如说我们可以在对应的家目录下修改.profile文件
修改好后保存并退出,重启bash后查看环境变量:
当然如果不是必须我们不建议对系统的文件进行修改因为往往可能在项目程序中造成一些意想不到的问题。需要注意的是使用export指令的时候等号两边没有空格。
三、为什么要有环境变量
关于为什么要有环境变量我相信读者应该心中已经有一定的答案了。一方面,环境变量的存在可以为我们的进程提供路径等信息,这些信息,可以加快操作系统对目标文件的检索速度。另一方面,环境变量具有可继承性,我们在编写程序的时候,可以使用这些环境变量来编写代码。比如使用不同主机所携带的不同环境变量字段来进行用户甄别的、再比如同一台云服务器上多人协作时,为什么每次用户登录时,都会跳到对应人的工作目录下,而不是登入时都在一个目录下也是受到环境变量的影响。
四、我都可以怎么获取环境变量
①可以使用echo $[环境变量名] 获取环境变量
②使用env指令
③在main函数中使用命令行参数,这个是由操作系统传递的,稍后演示
④在main函数中声明environ后获取,稍后演示
⑤使用函数接口getenv("环境变量名"),稍后演示
#include <iostream>
using namespace std;
int main(int argc,char *argv[],char *env[])
{
//test 1 使用命令行参数获取环境变量
for(int i=0;env[i];i++)
{
cout<<env[i]<<endl;
}
return 0;
// //test2 使用environ
// extern char **environ;
// for(int i=0;environ[i];i++)
// {
// cout<<environ[i]<<endl;
// }
// return 0;
// //test3 使用getenv()
// cout<<getenv("USER")<<endl;
//
}
上述代码的test1、test2、test3分别对应获取环境变量方法中的③、④、⑤。由于环境变量打印后的篇幅过大,这里就不对结果进行展示了,希望读者自行运行获得结果进行验证。其中test1与test2都可以获取全部的环境变量,而test3只能获取键值为USER的环境变量。