【Linux】——环境变量

目录

基本概念

常见环境变量

环境变量相关的命令     

echo

​编辑

export 

env

unset 

set

测试PATH  

添加自己的程序到PATH中 

方案一:将可执行程序拷贝到环境变量PATH的某一路径下

方案二:将可执行程序所在的目录导入到环境变量PATH 

 测试HOME

测试shell 

环境变量的组织方式 

通过代码获取环境变量

命令行参数

argc、argv

 env

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


基本概念

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

常见环境变量

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

环境变量相关的命令     

echo

如果我们想要查看某一个环境变量,只需要使用echo命令就可以了,如下:

echo $NAME //NAME为待查看的环境变量名称

【Linux】——环境变量_第1张图片

export 

设置一个新的环境变量(下面会进行具体演示)

env

显示所有的环境变量 

【Linux】——环境变量_第2张图片

部分环境变量说明:

【Linux】——环境变量_第3张图片 

unset 

清除环境变量 

set

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

测试PATH  

 了解完上面这些环境变量的相关指令后,我们先简单地写一小段代码,测试一下环境变量。

【Linux】——环境变量_第4张图片

 test.c经过g++编译后生成了可执行文件a.out,但是当我们想要运行自己生成的可执行程序前面必须带上./才可以执行,而使用ls等命令的时候却可以直接运行,同样作为程序为什么使用方式会存在不同呢?

【Linux】——环境变量_第5张图片

按常理来说,要执行一个可执行程序必须要先找到它在哪里,既然不带./就可以执行ls命令,说明系统能够通过ls名称找到ls的位置,而系统是无法找到我们自己的可执行程序的,所以我们必须带上./,以此告诉系统该可执行程序位于当前目录下。 

那么答案就不难解释了,系统就是通过环境变量PATH来找到ls命令的,让我们再查看一次PATH。

可以看到环境变量PATH当中有多条路径,这些路径由冒号隔开,当你使用ls命令时,系统就会查看环境变量PATH,然后默认从左到右依次在各个路径当中进行查找而ls命令实际就位于PATH当中的某一个路径下,所以就算ls命令不带路径执行,系统也是能够找到的

添加自己的程序到PATH中 

所以如果我们也想要让自己的可执行程序直接运行,只需要把自己写的程序添加到环境变量PATH中就可以了,有下面两种实现方式。

方案一:将可执行程序拷贝到环境变量PATH的某一路径下

 既然在未指定路径的情况下系统会根据环境变量PATH当中的路径进行查找,那我们就可以将我们的可执行程序拷贝到PATH的某一路径下,此后我们的可执行程序不带路径系统也可以找到了。

方案二:将可执行程序所在的目录导入到环境变量PATH 

将可执行程序所在的目录导入到环境变量PATH当中,这样一来,没有指定路径时系统就会来到该目录下进行查找了。 

将可执行程序所在的目录导入到环境变量PATH当中后,位于该目录下的可执行程序也就可以在不带路径的情况下执行了。

 

【小提示】

上面两种方式,在退出连接后再次登录均会失效。 

 测试HOME

任何一个用户在运行系统登录时都有自己的主工作目录(家目录),环境变量HOME当中即保存的该用户的主工作目录。

【Linux】——环境变量_第6张图片

测试shell 

 我们在Linux操作系统当中所敲的各种命令,实际上需要由命令行解释器进行解释,而在Linux当中有许多种命令行解释器(例如bash、sh),我们可以通过查看环境变量SHELL来知道自己当前所用的命令行解释器的种类。

而该命令行解释器实际上是系统当中的一条命令,当这个命令运行起来变成进程后就可以为我们进行命令行解释。

 

环境变量的组织方式 

【Linux】——环境变量_第7张图片 每个程序都会收到一张环境变量表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串,最后一个字符指针为空。

通过代码获取环境变量

命令行参数

main函数其实有三个参数,只是我们平时基本不用它们,所以一般情况下都没有写出来。调用main函数时会给main函数传递三个参数。

int main(int argc ,char* argv[],char* env[])

argc、argv

【Linux】——环境变量_第8张图片

【注意】在编译时要加上c99标准才能支持这样使用。

[hrimkn@VM-8-13-centos dir8]$ gcc myproc.c -o myproc -std=c99 

 运行结果:【Linux】——环境变量_第9张图片

 现在我们来说说main函数的前两个参数,main函数的第二个参数是一个字符指针数组,数组当中的第一个字符指针存储的是可执行程序的位置,其余字符指针存储的是所给的若干选项,最后一个字符指针为空,而main函数的第一个参数代表的就是字符指针数组当中的有效元素个数。

【Linux】——环境变量_第10张图片

 env

main函数的第三个参数接收的实际上就是环境变量表,我们可以通过main函数的第三个参数来获取系统的环境变量。

例如,编写以下代码,打印一下前十个环境变量。

【Linux】——环境变量_第11张图片 运行结果就是各个环境变量的值:

【Linux】——环境变量_第12张图片

 除了使用main函数的第三个参数来获取环境变量以外,我们还可以通过第三方变量environ来获取。

【Linux】——环境变量_第13张图片

注意: libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时要用extern进行声明。

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

除了通过main函数的第三个参数和第三方变量environ来获取环境变量外,我们还可以通过系统调用getenv函数来获取环境变量。
getenv函数可以根据所给环境变量名,在环境变量表当中进行搜索,并返回一个指向相应值的字符串指针。

例如,使用getenv函数获取环境变量HOME的值。

【Linux】——环境变量_第14张图片

 运行结果:

你可能感兴趣的:(Linux,linux)