【Linux篇】第六篇——环境变量(概念+作用+环境变量的查看和应用)

⭐️这篇博客就要开始聊一聊进Linux下环境变量相关内容了,相信大家或多或少都听过环境变量这个词把,我们在Windows操作系统下也能够看到它,而且我们之前应该都有配置过这个玩意,但是却不理解这是个啥,今天我就带大家来了解一下这个小玩意儿~


🌏概念

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,它是系统中某些具有全局性质的变量,通常是为了满足某些系统的需求

环境变量=变量名+变量内容(路径)
常见的几个环境变量

  • PATH : 指定命令的搜索路径
  • HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
  • SHELL : 当前Shell,它的值通常是/bin/bash

环境变量的查看

ehco $NAME 这里NAME指的是环境变量名

实例演示
在这里插入图片描述

🌏为什么要有环境变量?

系统的全局变量,都是为了方便用户、开发者和系统进行某种最简单的查找和定位,确认等等问题

给大家看一个例子:

通常,我们在使用ls、pwd这些指令时,我们是不需要带上路径的,而我们运行一个程序时,我们需要带上路径,这是为什么呢?
看下面的图,我们可以看到,ls这个指令的路径被写进环境变量PATH中了,所以,当我们执行ls这个指令时,系统会在环境变量PATH下挨个搜索路径,找到就执行,没找到就报错
在这里插入图片描述
那现在又有一个问题:我们的程序能不能用同样的方法实现不带路径就可以执行程序呢?
答案是肯定的。我们只需要将我们的程序所在路径导出到PATH中就可以

实例演示:export PATH=$PATH:path 导出环境变量(重启后自动失效。我们还可以选择通过把改程序拷贝到user/bin路径下,永久生效,但是不建议,会污染Linux的命令池)
在这里插入图片描述
在这里插入图片描述
这样myproc就也可以想ls一样跑起来了。

思考: ls如何实现列表参数?

在C/C++中,main函数其实是有三个参数的,如下:
int main(int argc, char* agrv[], char* env[]);
其中第一个参数就是指列表参数的个数,一般默认为一个,第二个参数是一个指针数组,里面存放的就是char类型的指针,指向的是字符串,这些字符串对应着的就是不同的参数

看下面一段代码:

#include <iostream>
#include <string>
#include <stdlib.h>

using namespace std;

int main(int argc, char *argv[], char *env[])
{
  int i = 0;
  for (; i < argc; ++i)
  {
    cout << "argv["<< i << "]:"<< argv[i] << endl;
  }
  return 0;
}

代码测试结果如下:
在这里插入图片描述

再来看一段代码:

#include <iostream>
#include <string>
#include <stdlib.h>

using namespace std;

int main(int argc, char *argv[], char *env[])
{
  int i = 0;
  for (; i < argc; ++i)
  {
    cout << "argv["<< i << "]:"<< argv[i] << endl;
  }
  string s = "-a";
  if (s==argv[1]){
    cout << "I am -a" << endl;
  }
  else{
    cout << "I am ..." << endl;
  }

  return 0;
}

代码测试结果如下: 从运行结果可以看出,ls可以不同参数有不同的功能,实现原理和这个是类似的
在这里插入图片描述

🌏环境变量相关指令

  1. echo: 显示某个环境变量值
    在这里插入图片描述

  2. export: 设置一个新的环境变量
    在这里插入图片描述

  3. env: 显示所有环境变量
    在这里插入图片描述

  4. unset: 清除环境变量
    在这里插入图片描述

  5. set: 显示本地定义的shell变量和环境变量

🌏环境变量组织方式

每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串,这些字符串存放的就是换变量
在这里插入图片描述

🌏通过代码获取环境变量

上面我们说过了,main函数有三个参数,介绍了前两个,那么第三个参数就是env指针数组,就是上面的这张图,里面存在着一个一个的环境变量

代码如下:

#include <iostream>
#include <string>
#include <stdlib.h>

using namespace std;

int main(int argc, char *argv[], char *env[])
{
  for (i = 0; env[i]; ++i)
  {
    printf("%d:%s\n", i, env[i]);
  }

  return 0;
}

代码运行结果如下:
在这里插入图片描述

🌏通过系统调用获取环境变量

先看一个查看环境变量的函数:getenv()
在这里插入图片描述
如何通过代码实现pwd的功能?
我们可以通过这个函数获取环境变量PWD,如然后打印出来,这样我们每次运行程序就有pwd的功能了。
代码如下:

#include <iostream>
#include <string>
#include <stdlib.h>

using namespace std;

int main(int argc, char *argv[], char *env[])
{
  cout << getenv("PWD") << endl; 
  return 0;
}

代码测试结果如下:
在这里插入图片描述

🌏环境变量的全局属性

环境变量通常具有全局属性,父进程的环境变量信息可以被子进程继承下去
实例演示:
代码如下:

#include <iostream>
using namespace std;

int main(int argc, char *argv[], char *env[])
{
  cout << getenv("MYENV") << endl;
  return 0;
}

测试结果如下:
第一次直接运行,发现没有结果,因为MYENV还是一个本地变量,还不是环境变量
在这里插入图片描述
第二次通过父进程bash导出环境变量MYENV,再次运行程序,有结果,这是因为子进程继承了父进程bash的环境变量,所以本次执行程序有结果
在这里插入图片描述
总结: 环境变量可以被子进程继承下去,因为环境变量通常具有全局属性

🌐总结

这是环境变量主要的一些内容,其中包括如何查看,如何通过代码获取,如何通过系统调用获取,还有环境变量通常具有全局属性的测试,今天的内容就先到这里面,喜欢的话欢迎点赞支持和指正~
在这里插入图片描述

  • 23
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 19
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呆呆兽学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值