目录
基本概念
常见环境变量
环境变量相关的命令
echo
编辑
export
env
unset
set
测试PATH
添加自己的程序到PATH中
方案一:将可执行程序拷贝到环境变量PATH的某一路径下
方案二:将可执行程序所在的目录导入到环境变量PATH
测试HOME
测试shell
环境变量的组织方式
通过代码获取环境变量
命令行参数
argc、argv
env
通过系统调用获取环境变量
如果我们想要查看某一个环境变量,只需要使用echo命令就可以了,如下:
echo $NAME //NAME为待查看的环境变量名称
设置一个新的环境变量(下面会进行具体演示)
显示所有的环境变量
部分环境变量说明:
清除环境变量
显示本地定义的shell变量和环境变量
了解完上面这些环境变量的相关指令后,我们先简单地写一小段代码,测试一下环境变量。
test.c经过g++编译后生成了可执行文件a.out,但是当我们想要运行自己生成的可执行程序前面必须带上./才可以执行,而使用ls等命令的时候却可以直接运行,同样作为程序为什么使用方式会存在不同呢?
按常理来说,要执行一个可执行程序必须要先找到它在哪里,既然不带./就可以执行ls命令,说明系统能够通过ls名称找到ls的位置,而系统是无法找到我们自己的可执行程序的,所以我们必须带上./,以此告诉系统该可执行程序位于当前目录下。
那么答案就不难解释了,系统就是通过环境变量PATH来找到ls命令的,让我们再查看一次PATH。
可以看到环境变量PATH当中有多条路径,这些路径由冒号隔开,当你使用ls命令时,系统就会查看环境变量PATH,然后默认从左到右依次在各个路径当中进行查找。而ls命令实际就位于PATH当中的某一个路径下,所以就算ls命令不带路径执行,系统也是能够找到的。
所以如果我们也想要让自己的可执行程序直接运行,只需要把自己写的程序添加到环境变量PATH中就可以了,有下面两种实现方式。
既然在未指定路径的情况下系统会根据环境变量PATH当中的路径进行查找,那我们就可以将我们的可执行程序拷贝到PATH的某一路径下,此后我们的可执行程序不带路径系统也可以找到了。
将可执行程序所在的目录导入到环境变量PATH当中,这样一来,没有指定路径时系统就会来到该目录下进行查找了。
将可执行程序所在的目录导入到环境变量PATH当中后,位于该目录下的可执行程序也就可以在不带路径的情况下执行了。
【小提示】
上面两种方式,在退出连接后再次登录均会失效。
任何一个用户在运行系统登录时都有自己的主工作目录(家目录),环境变量HOME当中即保存的该用户的主工作目录。
我们在Linux操作系统当中所敲的各种命令,实际上需要由命令行解释器进行解释,而在Linux当中有许多种命令行解释器(例如bash、sh),我们可以通过查看环境变量SHELL来知道自己当前所用的命令行解释器的种类。
而该命令行解释器实际上是系统当中的一条命令,当这个命令运行起来变成进程后就可以为我们进行命令行解释。
每个程序都会收到一张环境变量表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串,最后一个字符指针为空。
main函数其实有三个参数,只是我们平时基本不用它们,所以一般情况下都没有写出来。调用main函数时会给main函数传递三个参数。
int main(int argc ,char* argv[],char* env[])
【注意】在编译时要加上c99标准才能支持这样使用。
[hrimkn@VM-8-13-centos dir8]$ gcc myproc.c -o myproc -std=c99
现在我们来说说main函数的前两个参数,main函数的第二个参数是一个字符指针数组,数组当中的第一个字符指针存储的是可执行程序的位置,其余字符指针存储的是所给的若干选项,最后一个字符指针为空,而main函数的第一个参数代表的就是字符指针数组当中的有效元素个数。
main函数的第三个参数接收的实际上就是环境变量表,我们可以通过main函数的第三个参数来获取系统的环境变量。
例如,编写以下代码,打印一下前十个环境变量。
除了使用main函数的第三个参数来获取环境变量以外,我们还可以通过第三方变量environ来获取。
注意: libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时要用extern进行声明。
除了通过main函数的第三个参数和第三方变量environ来获取环境变量外,我们还可以通过系统调用getenv函数来获取环境变量。
getenv函数可以根据所给环境变量名,在环境变量表当中进行搜索,并返回一个指向相应值的字符串指针。
例如,使用getenv函数获取环境变量HOME的值。
运行结果: