> 文章列表 > 环境变量相关知识

环境变量相关知识

环境变量相关知识

目录

目录

谢谢你的阅读,这是对我最大的鼓舞

先说结论:

开始论述:

让我们举个例子

相关指令

 创建本地变量

创建环境变量

方法一:

方法二:

删除环境变量

子进程中也有环境变量

第一种:

第二种

第三种

环境变量通常具有全局属性

归纳论述



谢谢你的阅读,这是对我最大的鼓舞

先说结论:

  • 环境变量一般指在操作系统中用来指定操作系统运行环境的一些参数。
  • 环境变量通常具有某些特殊的用途,在系统中通常具有全局特性。

        环境变量是在系统中具有一定全局性质的变量,通常是为了满足某些系统的需求。指明操作系统的某些重要目录在哪。

开始论述:

        在linux系统中,命令还是工具又或是可执行程序,我们都同称为文件,但是为什么使用系统命令可以直接运行使用,而可执行程序却需要加上  . /  呢?为什么不可以和系统命令一样直接运行呢? 

这就要引出我们这篇文章的核心:环境变量

什么是环境变量,先理解变量,在语言层面,变量其实只不过是程序可操作的存储区的名称。每个变量都有特定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中。

那么环境变量其实也是变量,让我们看看有哪些环境变量

在命令行输入env

(= )等号前是环境变量的变量名字,后面是该环境变量的路径名称。

        当然了一个环境变量可以不止有一个路径信息。首先让我们学习查看某个环境变量的指令

命令"echo $THAT" THAT 环境变量名。$类似于指针解引用

这里的每一个变量都有一个或多个路径,他们以  :  划分。

让我们举个例子

先让我们看看ls的指令的路径
     

发现改路径usr/bin/位于PATH环境变量值中,这有什么联系吗?

这引出了我们的一个新的知识点,当我们在命令行打入ls指令

 在寻找时,一旦在某变量的某路径下寻找到了。

例子结论:操作系统会在环境变量中查看是否有某路径下有ls指令。

那么我们可以让我们的可执行程序如指令一样的不自己加寻址就可以运行吗?当然可以使用export命令

        这里有个注意点,export 后必须PATH=$PATH  :添加指令路径,这样就是让添加路径追加到PATH环境变量路径中,如果不这样写的话,直接PATH=添加指令路径,会将之前的路径覆盖。这样其他的路径下的指令将无法快捷使用了。

        但是这样的添加指令是不推荐的:首先这样的添加环境变量只是追加临时的路径,在下次重新登陆后环境变量还是会根据文件信息重置环境变量,如果想永久生效需要更改配置文件。

不要再系统的环境变量添加路径污染系统指令池。

        所以我们尽量自己写指令池,而且都要写入在文件中。

        这些系统命令怎么添加到环境变量文件呢?安装软件时,会把对应软件的可执行程序拷贝到环境变量的某个路径下,PATH只是环境变量之一,系统还有很多环境变量又来解决不同场景。

相关指令

这里还有于环境变量相关的指令。

1:echo:显示某个环境变量

2:export:设置一个新的环境变量

3:env:显示所有环境变量

4:unset:清除环境变量

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


 创建本地变量

类似于语言层面的,直接在命令行输入myset=100,回车,

这样myset就是在本地生成变量,可以使用set | grep查看是否在本地定义shell中。

创建环境变量

方法一:

在命令行添加export  xxxx=100(xxxx为变量名)

 如果为给A_NUMBER初始化,A_NUMBER就不会成为环境变量

方法二:

先创建shell本地变量A_NUMBER

再将本地变量加入环境变量

这里可以这样写A_NUMBER=A_NUMBER=100

这样就可以查询什么变量有什么值了

删除环境变量

使用unset删除刚刚创建的A_NUMBER环境变量

子进程中也有环境变量

第一种:

然我们先了解main函数其实又有参数的,类似于printf,scanf,拥有可变参数。

 编译后生成可执行文件,我们执行后

 每一个元素都是命令行上以空格分割的字符串。

那么显示代码中的子进程,这里我们要用二级指针的概念为大家讲解

如何在代码中显示环境变量内容呢?其实env是一个指针数组,每个元素都是char*类型的指针,每个都指向一个环境变量字符串。

数组中最后一个指针指向的是NULL空指针,作为数组的最后一个元素,以作为结尾。所以就算我们不知道该数组我们有几个元素,我们也可以遍历数组。

第二种

利用environ外联变量

 连接时是有个外界指针environ,指向着env数组,我们需要再我们自己的文件中声明外界变量即可。

关系就是这样的。所以我们可以通过environ访问环境变量。

第一种和第二种的遍历环境变量都是依靠环境变量数组的最后一个元素指向NULL做结尾,类似于字符串结尾'\\0'

第三种

使用系统函数getnev()查看某个函数变量

首先包含getnev函数的头文件为stdlib.h 

发现再子进程中可以通过getnev查看到想要查看的环境变量。

环境变量通常具有全局属性

环境变量通常具有全局属性,父进程的环境变量可以被子进程继承下去

为什么会继承呢?子进程不能是自己单独的环境变量吗?为什么要继承父进程的环境变量?

为了再进程运行时,需要使用环境变量路径下的各个工具,各个关联程序以及其他资源

现在我们验证子进程继承父进程的环境变量

第一步使用getenv查看是否有MY_ENV自定义环境变量

 

 编译后发现根本不存在该环境变量。

然后在命令行(test进程的父进程)创建一个自定义的环境变量

env查看,这时命令行的环境变量中就有了MY_ENV环境变量

让我们再一次运行test可执行程序

结果是,在父进程命令行的环境变量MY_ENV,会被子进程继承。

得出结论,子进程的环境变量是在运行时,从父进程中继承的 

归纳论述

1:环境变量其实就是可执行的文件(指令,工具也属于文件)在执行时的该文件的寻找路径。

2:在一些进程运行时,依赖的一些工具,这就要依靠环境变量提供的路径寻找工具的路径。

3:在子进程中也有属于自己的环境变量。

4:程序加载到内存中成为进程,该进程所使用的环境变量其实就是其父进程的环境变量继承的。


 谢谢能看到这里的靓仔!!!!!!!!!!!!!!