Linux中环境变量详解

这里是目录呀

  • 前言
  • 一、基本概念
  • 二、常见环境变量
  • 三、和环境变量相关的命令
  • 三、环境变量的组织方式
  • 四、通过代码如何获取环境变量
    • 1.命令行第三个参数
    • 2、通过第三方变量environ获取
    • 3、通过系统调用或设置环境变量
  • 五、环境变量通常是具有全局属性的
  • 六、命令行参数详解
  • 总结

前言

在前面的文章中我们讲述了关于进程的概念一,还没有掌握的朋友可以先去看看上一篇文章(https://blog.csdn.net/be_a_struggler/article/details/126094232?spm=1001.2014.3001.5501),毕竟这两篇的内容是息息相关的,先学习比较简单的内容对于学习后面的知识也会有很大的帮助,下面就让我们来继续探究关于Linux下进程的一些概念。

一、基本概念

在我们平时学习的过程中,有时候老师要我们安装一些集成开发软件的时候就会要求我们设置环境变量,可能很多人都听说过这个名词,但是并不知道它到底是什么,其实它就是一些系统参数,今天就让我们一起来探究一下环境变量究竟是什么东西。
基本概念

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

这里先举一个例子来帮助大家更好地理解环境变量。
例: 我们平时在使用Xshell的时候为什么直接输入ls,pwd等一些指令就可以得到我们想要的操作,而我们在运行自己写的代码的时候就要用./这样加上路径的方式,要知道我们如果只是单纯的输入ls指令,也是没有加路径的,那么系统优势如何找到ls指令并且运行的呢?这里其实就涉及到了环境变量的概念了。
我们先看一下我们写的代码生成的程序与Xshell中已存在的指令有什么区别。我们平时自己生成了一个可执行程序后,在运行的时候就必须是:./文件名称,例如./proc才能运行已经生成的可执行程序,./:就是当前路径的意思,这里我们用实例来示范一下。
Linux中环境变量详解_第1张图片
在这里我们用不同的方式来先后运行了ls指令和我们自己写的程序,这样都是可以运行的(在这六大家可以不用去关心程序的内容是什么,只需要知道它运行成功了就可以了)在最后的时候我们只输入ls,是可以运行的,但是只输入我们的的程序名称就会显示该指令并不存在的错误,这里就涉及到了我们前面提到的环境变量的概念。
解析:
在这里插入图片描述
通过echo $PATH我们就可以查看我们的环境变量,通过上面的图片我们不难发现,这里的环境变量其实就是一条条的路径,这些路径其实就是我们搜索命令时的搜索路径,下面我们来分析一下,
这里我们可以看到中间有很多的冒号,其实这里的冒号就是来分割环境变量的,当我们输入指令的时候系统就是从头开始自动去每一条路径下挨着去找我们所输入的指令,找到后就会执行相对应的操作,当然了,找不到的话就会报出相应的提示。
我们再查看ls的路径发现其路径是包含在环境变量里面的,这里就很好的解释了我们最开始提出的问题,因为ls的路径是包含在环境变量里的,所以我们可以直接去执行ls指令对应的操作。但是我们自己写的程序并没有在这一些已经设置好的环境变量中,所以我们不能直接去运行我们自己的程序,需要加上路径。这里有的人可能要问了,我们如果要想像直接运行指令一样去运行我们自己已经写好的程序,可不可以呢?其实是可以的,这里一共有两种方法。

  1. 第一种方法是可以将我们已经写好的程序放入上面路径中的任何一条路径下,我们既可以直接运行了。一般情况下我们可以直接将其放入user/bin路径下(用户的二进制程序),但是其实我们是强烈不建议这一种做法的,我们把自己的可执行程序拷贝到对应的路径下的这一个操作其实就是安装,相当于我们把这个命令安装到系统里了,但是我们这种操作会污染别人写好的命令池。
  2. 第二种方法是我们吧我们写好的程序的路径直接放入环境变量中,下面我就教大家来设置一下。
    Linux中环境变量详解_第2张图片
    添加成功后我们就可以像运行程序中的指令一样来运行我们自己的程序了。这里顺便说一下,这种设置环境变量的方法大家可以随便去搞,设置成什么其实都没有关系,因为当我们重新启动服务器的时候我们之前设置的环境变量就没有了,并不会产生什么影响。

二、常见环境变量

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

三、和环境变量相关的命令

  1. echo: 显示某个环境变量值
  2. export: 设置一个新的环境变量
  3. env: 显示所有环境变量
  4. unset: 清除环境变量
  5. set: 显示本地定义的shell变量和环境变量
    Linux中环境变量详解_第3张图片

三、环境变量的组织方式

Linux中环境变量详解_第4张图片
每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串。

四、通过代码如何获取环境变量

1.命令行第三个参数

这里问大家一个问题,main函数可以传的参数有几个,我们平时写的代码的main函数其实传了三个参数,下面让我们一起来看一下。
Linux中环境变量详解_第5张图片
既然在介绍环境变量,那么我们就先来看看传的环境变量中的一些数据
Linux中环境变量详解_第6张图片
在begin和end中间所打印的数据就是传给main函数的环境变量。而其中的一些环境变量也是我们之前提到过的,大家可以进行一下对比,有很多的相似之处。

2、通过第三方变量environ获取

除了上述方法以外C语言还提供了一个全局的变量environ,当程序启动的时候这个变量就会指向我们的环境变量表,通过该变量也可以获取环境变量数据。我们用这个方法试一下。
在这里插入图片描述
Linux中环境变量详解_第7张图片
main函数中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时 要用extern声明。
Linux中环境变量详解_第8张图片
但是我们在平时基本上是不会用上面的两种方法去获得环境变量的,因为上面的两种方式都是把所有的环境变量都打印出来,我们需要一行行的去找我们需要的环境变量,这样其实是很浪费时间的。为此C语言提供了另一种函数。来访问特定的环境变量。

3、通过系统调用或设置环境变量

putenv
getenv,这次我们只讲述getenv。
Linux中环境变量详解_第9张图片
Linux中环境变量详解_第10张图片
在这里插入图片描述
在这里我们可以直接通过getenv()函数获取PATH中的内容。

五、环境变量通常是具有全局属性的

讲到这里相信大家都已经知道什么是环境变量了,但是问题也就随之而来了,我们程序中的环境变量是从哪里来的呢?谁传给我的?
这里我就来为大家解答一下,我们的环境变量其实都是从父进程继承下来的,也就是说当父进程生成一个子进程的时候,会将自己的环境变量传给自己的子进程。
Linux中环境变量详解_第11张图片
在这里我们查看了我们当前进程的父进程的pid,通过查询我们可以发现我们的父进程就是bash,也就是最初形成的进程,所以我们的环境变量都是由bash进程传给我们的。至于bash的环境变量是从哪里获取的,其实他的环境变量是由操作系统给的,当我们启动Xshell的时候,他的一些附件就会给他传递这些环境变量。那么说了这么多,也是时候证明一下我所说的内容了,下面就给大家示范一下。
Linux中环境变量详解_第12张图片
接下来我们再来验证一下为什么说环境变量具有全局属性。
Linux中环境变量详解_第13张图片

六、命令行参数详解

命令行参数就是自己在启动这个程序的时候给程序传入的选项,argv就是一个个参数,argc就决定了argv这个数组有多大。
Linux中环境变量详解_第14张图片
下面我们再来写一段代码
Linux中环境变量详解_第15张图片
通过查看上面我们执行代码时的输入大家可以联想到什么呢?
Linux中环境变量详解_第16张图片
我们写的程序在运行时进行的输入是不是与我们在执行一些命令时的操作是一样的,其实这就是我们在执行一些指令时候的原理,ls就为要执行的程序,其后面带的就是它的一些选项,这些都是命令行参数,传入程序中然后就会执行相对应的操作。是不是有一种恍然大悟的感觉呢。

总结

今天我们关于Linux中的环境变量的内容讲解到这里就已经结束了,不知道大家是不是与小编一样收获了很多新的东西呢?学完这一节的内容以后相信大家已经对环境变量有了一定的了解了。上面讲述的过程中我们做了很多的实验来证明环境变量确实存在,并且也验证了关于它的一些性质,大家下来也可以按照我上面给出的代码自己实验一下,相信会有更好的理解。

你可能感兴趣的:(Linux学习专栏,linux,服务器,运维)