环境变量:保存运行环境参数的变量;使程序运行环境配置更加灵活;以及可以通过环境变量实现进程间的小量数据通信(父子进程)
环境变量命令操作
-
env
查看环境变量
-
set
查看所有变量。变量分为普通变量和环境变量。一般set | grep 变量名
这样用,因为set的变量太多。 -
export
声明/设置环境变量
刚开始MYVAL只是普通变量,通过env查找不到,然后对MYVAL进行export声明,此时的MYVAL就是环境变量,通过env可以查找到。也可以直接设置环境变量。
-
echo
查看指定变量
echo $PATH: $的作用就是把PATH值当做变量名使用,引用变量内容。 -
unset
删除环境变量
PATH变量
我们先来看看PATH中的内容。
我们发现PATH中都是一些路径,那这些路径都用来干什么?
我们在shell中输入命令时,直接输入ls等命令名称,就可以执行。ls也是usr/bin目录下的可执行文件,但是在我们自己的目录下这样使用就会报错,我们需要在前面加上路径。
这怎么还区别对待?其实并不是区别对待,我们仔细观察PATH环境变量,会发现ls所在的user/bin路径就在其中,那如果我们把当前路径加进去,是不是也可以直接使用?
现在我们再来直接使用,看看是否还会出错。
现在看来,就是需要把路径加入PATH中,才能直接使用。
总结: PATH就是程序运行的默认搜索路径。在命令行终端中输入命令名称可以直接执行对应名称的命令程序,实际上是因为shell捕捉到输入的命令名称之后,然后去PATH环境变量指定的路径下去找这个程序,找到了就运行,找不到就报命令没有找到的错误。
父子进程间环境变量的传递
我们先来执行这个简单的程序,然后发现它也有父进程,他的父进程就是bash。bash是命令行终端里第一个命令行解释程序,是shell的一种。
事实上,我们在一个终端里默认运行的程序,它们的父进程都是shell程序。
我们先在shell中定义一个环境变量,然后再去他的子程序中查找是否有这个环境变量,观察它们之间的传递性,再看看普通变量与环境变量的区别。
char *getenv(const char *name);
查找环境变量的函数,通过名称获取值
#include<stdlib.h>
头文件
在shell中分别定义环境变量、普通变量
在子进程中查找环境变量、普通变量
我们发现可以找到环境变量,但是找不到普通变量。那就说明父进程不会给子进程传递普通变量,但是父进程给子进程传递环境变量。子进程现在有的环境变量,是父进程shell它传递的。
环境变量与普通变量的区别:环境变量父子进程之间具有传递性,普通变量父子进程之间不具有传递性。
总结:
shell中运行的进程都是shell的子进程。不同的shell有不同的环境变量。
查看环境变量的代码操作:
-
char *getenv(const char *name);
通过名称获取值
-
extern char **environ
;声明已有的全局变量,这个变量中保存了所有能够访问到的环境变量的字符串地址
我们可以通过这个全局变量,查看能够访问到的环境变量。 -
main函数是一个不定参函数,
int main(int argc, char* argv[], char* environ[])
argc---->程序运行参数的个数
argv---->程序运行参数字符串地址
environ---->环境变量的字符串地址
我们也可以通过main函数的第三个参数,查看能够访问的环境变量。
我们顺便一起来看前两个参数的用法。
./path、ls、-l、-a都属于运行参数。所以参数个数就有4个,它们的地址都放在argv中。