站点图标 AI技术聚合

详解环境变量

目录

前言

我们在Linux系统中进行操作的时候通常会发现,当我们使用系统的命令的时候,比如:ls,pwd,cd等等,通常不需要带对应的命令的路径,只需要直接敲对应的命令即可,其实这些命令都是程序,而当我们运行自己写的程序的时候却发现必须带相关路径,如果没带路径,就会报出:command not found的错误,其实也很好理解,因为我们要执行一个命令或者程序首先肯定要找到这个程序或者命令,知道这个程序或者路径在哪里,才能够执行它,而系统中的命令不需要带路径就能执行的原因跟今天要学习的环境变量中的PATH变量有关系

一、什么是环境变量?

环境变量:环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数(变量),如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们所链接的动态静态库(后面学)在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。还有其他用途等后面学完了常见的环境变量就能够理解了,环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性

二、查看环境变量的方法

  • env:用于查看系统中所有环境变量的命令
  • 也可以使用env配合之前学习的文本行过滤工具:比如env|grep PATH,这样可以方便找到我们想要的环境变量

三、查看环境变量的内容

通常环境变量都会存储相应的值,比如:PATH环境变量存储的是常用指令的路径,方便系统快速找到对应命令的路径,从而执行对应命令

比如,现在在系统中有一个环境变量叫做PATH,那么我们该怎么查看这个环境变量的内容呢?
我们可以采用echo命令

  • 如果只是echo 环境变量

    显然结果不对
  • 正确的方式:echo $环境变量,如:echo $PATH

四、普通变量VS环境变量

  • 普通变量:直接在命令行上定义的变量

如上的aaaa就是一个局部变量或者称为普通变量,可以通过echo $变量名需要知道的是,它是不能通过环境变量找到的

  • 环境变量:上面已经介绍过环境变量的概念,也介绍了查看系统环境变量的方法,其在系统中的展示方法通常为,环境变量=值:值….,环境变量中不同的值是通过:隔开的

五、导出环境变量

Linux系统中导出环境变量的方法是使用export命令,使用方法:export 环境变量名=环境变量的值,比如:export bbbb=1,意思为:导出一个环境变量为bbbb,这个环境变量的值为1,方法也就是在普通变量的定义基础上在前面增加一个export

六、常见的环境变量

注意查看方法都是使用:echo $环境变量名

以上圈出的就是常见的环境变量,下面逐一进行讲解

  • HOSTNAME:查看当前主机的类型
  • SHELL:查看SHELL
  • HISTSIZE:查看能够存储的历史命令的最大条数
  • SSH_CLIENT:查看IP地址
  • USER:查看正在使用Linux系统的用户
  • PATH:查看一些常见的命令存放的路径


测试PATH

  1. 创建一个path.c文件和makefile文件

  2. 编译形成可执行程序

  3. 运行可执行程序,这里需要知道我们如果加上路径(./path)那么程序就可以正常运行,但是如果没有加入路径的话,那就不能正常运行该程序

  • 那么应该怎么处理,才能够让我们不加入可执行程序的路径也能够使程序正常运行呢??
  1. 将可执行程序的路径加入PATH环境变量中:通过export PATH=$PATH:当前可执行程序的路径,export表示导出的是环境变量,$PATH表示原来PATH中的内容, $PATH:当前可执行程序路径表示PATH原来的值+当前可执行程序,然后赋给PATH,也就是说后面的PATH的值变成了PATH原来的值+当前可执行程序的路径
  2. 使用echo命令查看加入路径之后的PATH环境变量
  3. 运行可执行程序 :此时执行的命令不再需要加入可执行程序的路径了,因为通过PATH环境变量可以找到当前可执行程序的路径了
  • PWD:查看当前的路径
  • HOME:查看当前用户的家目录

七、set命令:查看普通变量或环境变量

  • 查看普通变量
  • 查看环境变量

八、C/C++语言中main函数中的参数

我们平时在写C语言或者C++语言中的main函数时一般是不带参数的,但是实际上,main函数是可以带三个参数的,下面将详细讲解相关参数的作用

  • 一般情况
  • 带参数的情况
1、main函数的第一个和第二个参数
  • 第一个参数argc:表示argv数组中存放的字符指针个数
  • 第二个参数argv:存储的是相关的字符指针,指针指向的是一个个的字符串
  1. 将main中的路径加入环境变量使运行可执行程序时不需要加入路径

    通过以上的实验结果,我们可以看到数组中的第一个指针指向的内容(字符串)是可执行程序文件的名字,接下来我们可以加入一些选项来丰富实验内容
  2. 加入选项-a-b-c-d

从实验结果可以看出来,数组中的第一个指针指向的内容是可执行程序的文件名,第二个开始的指针指向的内容是依次加入后的选项,就是我们在命令行中输入的东西,因为我们知道我们在命令行中输入的东西在运行可执行程序的时候,第一个通常是路径+可执行程序,因此,一般情况下,argv中的第一个元素指向的字符串是路径+可执行程序名,后面的内容就依次是在命令行中从键盘输入的内容,上面的例子是选项,也可能是其他内容,比如后面实现的一个命令行的计算器中可能出现的是数字

应用:写一个简单的命令行版本的计算器
  1. 建立一个cal项目

  2. 创建cal.c文件和makefile文件

  3. 使用及结果

在这个简单的命令行计算器的代码中需要注意一些点:

  1. 命令行参数均为字符串,因此,在键盘上获得的数字也是字符串,所以在进行计算之前一定要先使用atoi函数将其转化为整数,atoi函数是C语言中的一个函数,其作用是将字符串转化称整数,头文件是<stdlib.h>
  2. 在代码中可以加入该计算器的使用方法(说明书),以便不知道怎么使用的用户可以正常使用

基本的思路

首先判断用户输入的字符串的个数,我们需要知道的是用户在命令行上输入的都是一个个的字符串,那么字符串会被main函数的第二个参数所获取,存放在该数组中,如果说用户输入的字符串的个数不符合要求(像这个场景就是要求用户输入的字符串的个数是4),那么就应该给用户提示使用方法,如果说符合要求了,我们就需要根据预先设定的功能让用户输入对应的字符串完成对应的功能,并使用if
else判断用户输入的字符串需要完成的功能,还需要知道的是如果用户输入的不是预先设定的计算方法,那么就应该提示用户输入对应的指令

2、main函数的第三个参数

main函数的第三个参数叫做env,叫做环境变量

  1. 创建一个项目
  2. 创建main.c文件和makefile文件
    代码内容就是依次遍历env中的内容,然后将其中的内容打印出来

  3. 结果显示


从上面的实验结果我们可以看到,当执行程序的时候,会给main函数传入系统中需要使用到的环境变量,因此,查看系统中的环境变量除了采用env命令进行查看之外还可以通过C语言函数中的main函数的第三个参数进行查看

九、获取环境变量的方式

1、通过main函数的第三个参数

通过main函数的第三个参数,我们可以直接在程序中遍历env数组的内容,然后将其内容依次打印显示在显示屏上,查看到系统中所有的环境变量之后,可通过echo $环境变量进行查看获取

2、通过environ变量

envrion是系统指定的一个变量,声明的时候需要加上extern

  1. 构建项目

  2. 运行结果


分析:environ是一个char**类型的指针,其中存放的是char*,因此我们可以依次遍历其中的内容,使其依次打印显示在屏幕上,其使用方法和main函数的第三个参数相似

通过这个方法同样可以将系统中的所有环境变量显示出来

3、通过系统调用接口getenv
  • 查看getenv系统调用接口
  • 创建test.c文件和makefile文件


    在使用getenv系统接口的时候一定要注意包含头文件stdlib.h,getenv()函数中传参的时候一定要给环境变量加上双引号
  • 实验结果

十、环境变量具有全局属性

环境变量是可以被子进程继承下去的,而普通变量是无法被子进程继承下去的

我们在系统中随便写一个进程,我们会发现其父进程就是bash,bash是系统创建的一个进程,其可以派生出很多的子进程,系统中几乎所有的进程的父进程都是bash,我们需要知道的是环境变量可以被bash派生出来的子进程继承下去,而普通变量是没有办法被bash继承的子进程继承下去的
实验:

1. getenv中没有接收环境变量


2. getenv中接收的是普通变量
  • 创建一个普通变量
  • 源代码
  • 实验结果

    从实验结果我们可以看出,结果仍然是空指针,说明普通变量确实没办法被子进程继承下去
3. getenv接收的是环境变量
  • 导出一个环境变量

  • 源代码

  • 实验结果

    从实验结果我们可以看到,子进程确实可以获得环境变量的结果,因此,环境变量是可以被子进程继承下去的

总结

今天我们主要学习环境变量的相关概念,以及学习了如何查看系统中所有的环境变量和查看具体环境变量的内容,还有学习如何导出新的环境变量和将自己写好的可执行程序的路径加入PATH环境变量,还知道了环境变量具有全局属性,最后还介绍了获取环境变量的几种常见的方式,在介绍之前还学习了C/C++中main函数的参数的意义和作用

版权声明:本文为博主作者:楠鹤晴原创文章,版权归属原作者,如果侵权,请联系我们删除!

原文链接:https://blog.csdn.net/m0_63019745/article/details/127973538

退出移动版