👉环境变量👈
基本概念
- 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。
- 如:我们在编写 C/C++ 代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性。
ls、pwd 等指令其实是可执行程序,而我们编译生成的也是可执行程序,为什么不能像 ls、pwd 等就输入指令就可以执行对应的可执行程序呢?而需要输入./myprocess才能执行我们写的程序呢?
其实要执行一个程序或(指令),首先需要找到这个程序,而./myprocess就是指明在当前路径下找该程序。那是不是 ls、pwd 等指令就不用找呢?其实不是,这些指令也需要通过路径来找到对应可执行程序,只不过这个工作交给操作系统做了。
那如果我们想要输入指令就可以执行我们的程序,怎么才能做到呢?一种方法是将我们的可执行程序拷贝到/usr/bin/路径下,但是不建议这么干!
还有另一种方式就是将当前路径添加到环境变量 PATH 中。
echo $PATH #查看环境变量PATH
注:当我们输入一个指令时,操作系统会在环境变量 PATH 中的路径查找,看是否有指令所对应的执行程序。如果没有就报错,有就执行相应的程序。环境变量 PATH 中的路径是以冒号 : 进行分隔的。
将当前路径导入环境变量 PATH 中
上图的导入方式是错误的,其会将 PATH 中原有的路径覆盖掉,进而导致很多的指令无法使用。不过,这个问题很容易解决,只需要重新启动一下 Xshell 就可以了。当然,也可以自行调回来。
正确的导入方式
export PATH=$PATH:当前路径 #将当前路径导入环境变量PATH中
注:系统的默认搜索路径就是环境变量 PATH 中的路径。
在命令行 bash 中也是可以定义变量的,环境变量也是这么定义的。
系统帮我们配置的环境变量,每次开机操作系统都会帮我配置好。
常见环境变量
- PATH:指定命令的搜索路径
- HOME:指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
- HOSTNAME:主机名
LOGNAME:当前登录用户的用户名
HISTSIZE:历史命令最大容量
env #查看全部环境变量
设置环境变量
通过myval=1234567类似的方式设置的是本地变量,相当于 C/C++ 中的局部变量,而环境变量是具有全局属性的。所以无法在环境变量中找到myval。
注:getenv 函数能够获取到指定的环境变量。如果没有指定的环境变量返回 NULL,有的话返回指向该环境变量字符串的首元素地址。
export 本地变量 #将已经定义好的本地变量导入到环境变量中 export 变量名=字符串 #将变量导入到环境变量中
注:环境变量默认都是字符串,所以设置时双引号可以带也可以不带,但最好带上。因为环境变量的内容有可能会有空格。
mycmd 是系统进程 bash 的一个子进程,mycmd 会继承父进程的具有全局属性的环境变量。为什么要继承环境变量呢?其实是为了满足不同的应用场景,如:让 bash 帮我找指令所处的路径以及身份认证等等。
为了说明环境变量具有全局属性,我再给大家举一个例子:ls 是一个可执行程序,显示当前路径的文件。那 ls 是怎么知道现在所处的路径呢?其实系统进程 bash 有一个环境变量 PWD,其所记录的就是当前路径。ls 指令执行也是创建进程来执行的,那么它就会继承父进程 bash 的全部环境变量,进而知道当前所处的路径。
上图的代码是不是就相当于我们写了个 pwd 指令啊?其实是的!!!这也就是环境变量所带来的意义!以前我们所使用的指令,也是通过 C语言写的。如果我们自己写的代码再加上一些系统调用接口和环境变量,也能实现系统给我们提供的指令。
set #显示本地定义的shell变量和环境变量
清除环境变量和本地变量
unset 环境变量 #清除指定的环境变量 unset 本地变量 #清除指定的本地变量
获取环境变量
环境变量 USER 最大的意义就是可以标识当前使用 Linux 的用户。
以前我们执行一些指令或者打开一些文件会提示我们权限不足Permission Denied
,原因就是通过环境变量USER
得知当前的登录用户与文件的拥有者、所属组相比,看当前用户是不是属于这两个角色,也就知道当前用户有没有对应的权限。
main 函数的命令行参数
那命令行参数有什么用途呢?其实命令行参数让程序根据参数的不同而做不同的事情!见下方例子:
命令行参数最大的意义就是根据选项的不同,让程序执行不同的任务和功能。
其实 main 函数还有第三个参数,就是字符指针数组char* env[]
,其也是以NULL
结尾的。main 函数的第二个参数是命令行参数表,第三个参数是环境变量表。
通过上图就可以看到,操作系统确实会把环境变量传给 mian 函数的第三个参数char* env[],且该数组是以NULL结尾的。
除了上面的两种获取环境变量的方式,还有一种方式就是利用char** environ来获取环境变量。其实指针environ就是指向环境变量表char* env[],它是是初始化好的全局的二级指针。
以上就是在进程的上下文中,获取环境变量的三种方式。
- getenv
- char* env[ ]
- extern char** environ
注:stat 可以获取文件的属性。本地变量不能被子进程继承,echo 命令也是一个子进程,但可以使用 echo 命令来打印本地变量。
👉总结👈
本篇博客主要讲解了什么是环境变量、为什么要有环境变量、环境变量的应用场景、常见的环境变量、如何设置、清楚和获取环境变量等等。那么以上就是本篇博客的全部内容了,如果大家觉得有收获的话,可以点个三连支持一下!谢谢大家!💖💝❣️