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

Posted 呆呆兽学编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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,再次运行程序,有结果

总结: 环境变量可以被子进程继承下去,因为环境变量通常具有全局属性

🌐总结

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

以上是关于Linux篇第六篇——环境变量(概念+作用+环境变量的查看和应用)的主要内容,如果未能解决你的问题,请参考以下文章

python基础篇第六篇模块补充正则表达式

Lua从青铜到王者基础篇第六篇:Lua字符串

Linux从青铜到王者第六篇:Linux进程概念第二篇

第六篇Camunda系列-流程变量

第六篇Camunda系列-流程变量

第六篇Camunda系列-流程变量