环境变量
- 一.基本概念
- 二.常见的环境变量
- 1.PATH:指令搜索路径
- 2.HOME: 指定用户的主工作目录
- 3.SHELL:当前Shell,它的值通常是/bin/bash
- 三.查看环境变量的方法
- 四.命令行参数
- 五.环境变量增加和删除
- 六.本地变量
一个问题:我们在写一段代码并编译成可执行程序后,想要执行它需要加./,而在使用ls,pwd等指令时却不需要加当前路径,这是怎么回事呢?这就要提到环境变量了。
一.基本概念
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性。
二.常见的环境变量
1.PATH:指令搜索路径
查看PATH
它的内容是由一串路径+冒号+另一串路径+冒号+…。它用冒号作为分割符,定义出了许多路径。那么像ls,pwd这些指令在执行时就会在PATH里挨个寻找路径,执行正确的路径;而我们自己的可执行程序的路径并不在定义里,所以需要加./。
我们也可以将自己的可执行程序的路径添加到PATH里。
2.HOME: 指定用户的主工作目录
查看HOME
刚登陆xshell时的目录所处的目录是/home/chz,为什么当一个用户登陆时会自动到它的家目录里呢?这是因为当你登陆xshell时,xshell会自动识别用户,然后填充该用户的HOME变量。
3.SHELL:当前Shell,它的值通常是/bin/bash
查看SHELL
通过$SHELL可以看到当前shell的可执行程序。
三.查看环境变量的方法
通过指令查看
通过系统接口查看
四.命令行参数
一个小知识:main函数可以带参
第一个参数是整形,第二个参数是指针数组。argc代表argv里的元素个数。接下来打印出来看看。
main函数在用户层面上看是入口函数,但实际上main函数并不是第一个被调用的函数,它会先被其他函数调用,而argc,argv就是传的参。在我们看来我们输入的是./mycmd-a但bash实际上是以空格为分隔符直接解释成了"./mycmd" "-a"两个字符串。再把字串的个数存入argc,每个子串的首地址保存在argv里。将字符串打散这一过程就是命令行解析。
为什么要这么做,看一段代码
所以命令行参数有一个重要功能就是为指令提供多个选项。
main函数只有这两个参数吗
我们直接遍历env[]也可以获得全部的环境变量。并且我们可以发现这里的环境变量与env指令里的环境变量一模一样,所以其实我们写的程序的环境变量是继承于父进程的。这也是为什么环境变量具有全局性。
结论:我们所运行的进程,都是子进程,bash本身在启动的时候,会从操作系统的配置文件中读取环境变量信息,子进程会继承父进程交给我的环境变量!
五.环境变量增加和删除
增加
同时在这里也可以通过执行自己写的子程序发现子程序里的环境变量也有了MY_VALUE,进而进一步验证了环境变量是由父进程里继承而来的。
删除
六.本地变量
本地变量就是我们可以直接在命令行里定义的变量
查看
set可以查看所有变量包括环境变量和本地变量
本地变量只在本BASH内部有效,不会继承。
又一个问题:既然本地变量不能被子进程继承,那么我们为什么可以使用echo将它打印出来呢?这其实是因为echo不需要创建子进程。