目录
一.什么是环境变量?
1.定义:
2.性质:
二.常见的环境变量:
1.常见的环境变量:
2.设置与环境变量相关的指令:
2.1 env指令的试验:
2.2 echo命令:特性之一:输出指定的内容到大屏幕中
2.3.set指令的试验:
2.4.export指令的试验:
2.5.unset指令的试验:
3.环境变量相关的系统调用函数:
getenv();
例2:模拟Permission denied警告的底层实现:
例3:模拟实现一个PWD命令:
环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数。
比如:我们在写C/C++代码的时候,在链接过程中,我们从来不知道我们所链接的动静态库在哪里,但照样可以连接成功,原因就是操作系统有相关的环境变量去帮助编译器去进行指定路径下的查找。
环境变量通常具有某些特殊用途,在系统当中通常具有全局特性,可以被子进程继承下去。
我们在刚开始上Java课时,老师会要求我们修改和添加指定的环境变量:
以上为Windows系统中环境变量的设置。
我们先来了解一下这些环境变量大概是什么,还有与环境变量相关的命令有什么。进而再详解每个环境变量。
PATH:指定命令的路径搜索
HOME:指定用户的主工作目录(几用户登录到Linux系统中,默认的目录)
SHELL:当前Shell,它的值通常是/bin/base
env :显示所有环境变量
echo :查看某个环境变量的值
export:可以设置一个新的变量并将其移到env中
unset :清除掉某个之前就设置好的环境变量 / 本地变量
set :显示本地定义的shell变量和环境变量
例:
例1:
例2:查看环境变量的指定参数
例:
我定义了一个变量muval并将其赋值为123,通过echo命令查询该变量时,也可以查到,表明变量设置成功。
但在使用env | grep muval指令(该指令的作用是:在所有环境变量中,通过grep指令查询muval变量)时,发现什么也没有,这是为什么?
其实我们直接在屏幕上设置定义变量的方式并不属于环境变量,而属于本地变量的创建。我们可以根据上面学到的set指令去操作该指令查找进而验证这番猜想,如上图,使用set | grep muval :发现显示了muval及其数值。
总结:muval=123——这是设置环境变量的错误方法;
muval=123——这是设置本地变量的正确方法
例:
该指令的具体用途就是:muval是本地变量,export将其从本地变量移动到环境变量中去。
使用export去设置muval便可以让muval成为环境变量!——设置环境变量的正确方法。
例:以上一个例子为前提:
使用unset 指令可以删除之前设置好的某个环境变量。那么使用grep也搜不到该变量了。
例2:本地变量也是一样的情况:
设置WangYuan变量,并将其赋值crush。 unset 本地变量后,再使用grep搜索也是一样的结果。
环境变量相当于全局变量,存在于所有的shell中,在我们登录系统的时候就已经又了相应的系统定义的环境了。Linux的环境变量具有继承性,即子shell会继承父shell的环境变量,并且本地只在当前进程内有效。而本地变量相当于局部变量,本地变量的属性不会被子进程所继承。
这时,我们会想到曾经使用过的指令,使用which去查看这些指令的路径:
发现它们都处于/usr/bin中,使用方式是直接输入指令名称并按回车即可显示效果。
执行该代码:
而在执行process2.exe的过程需要额外加上./才能执行 ,直接输入process2.exe却不行,原因就在于该可执行文件并不在环境变量文件下!
而pwd,Is,cd指令,它们的底层实现也都是可执行文件,也是需要指定路径+pwd 才可以运行出来的,但是它们都属于环境变量,简化了指令的繁琐书写,所以直接输入指令名称,不需要./就可以执行! ! ! 如下:
所以我们也可以将自己写好的可执行文件移动到/usr/bin环境变量目录下,就可以直接当指令运行了:
代码解析:子账户身份下,使用sudo指令提升自身权限,将可执行文件拷贝到/usr/bin目录下,即使不使用./也能运行!
但是这里强调一点:不要随便加文件到/usr/bin中!没有特殊情况,不要这样做!
getenv函数的作用就是:getenv函数会 “根据当前用户”,通过该用户输入的形参去env中查找指定的环境变量,并显示该变量的数值!
我们常用的getenv就是红色框起来的函数,形参是一个字符串,函数返回值是字符指针。
若getenv找到了,则返回该变量的内容,若没有找到,则返回空(NULL 或者nullptr)。
为什么getenv函数的返回值是char*呢?原因在于:env环境变量中的所有内容都是由字符串组成的。
例1:写一个源代码去验证一下该函数的作用:
当我们使用czj为子用户去运行该代码时:
表明:我们使用getenv能够成功获取到env中那些指定的环境变量。
但当我们使用root用户去运行该代码时:
在运行之前,需要先使用指令:su - (这步很重要!!! 不能只用su)
切换为root用户,然后进入你写好的这个可执行文件目录下:
发现:用户的不同,所执行出的代码获取到的环境变量也就不一样!
那么USER环境变量最大的意义就是:可以唯一标识当前使用Linux的用户。
当我们知道使用某些指令时,得到的结果是Permission denied,意思就是我们没有权限使用这些指令。例如我们当前是子用户,想cd进入到root用户下的目录中,就会出现这样的警告:
而这种警告的实现方式就是通过USER环境变量去判断当前用户是否有权限去做这些事情的!
采用strcmp函数去判断出:czj!=root,进入else语句输出权限不足,无法访问
运行该代码结果: