赞
踩
1. 什么是环境变量
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数
2. 为什么会有环境变量
linux操作系统中, 我们可以直接执行ll等其他指令, 但是对于自己写的程序, make后生成文件, 必须要 . /文件
才能执行。对于执行一个指令来说,我们知道,指令事实上也是一种文件,对于执行这个文件,我们就需要先找到这个文件,在将这个文件执行。而对于ll来说,其对应的文件事实上已经是Linux系统分配到全局的,也就是在默认路径(根目录),因此不需要指定路径搜索这个指令对应的文件,直接ll就代表从根目录查找从而执行。而对于make生成的程序,我们知道这个可执行程序是在当前路径下,并不在根目录中,因此我们也就无法直接输入文件名从而执行,而是需要找到这个文件对应的路径再去执行,因此 ./就代表着当前路径,而./此文件就代表找到这个文件的路径并且去执行它!
如下:
通过添加环境变量, 我们的程序不用 ./ , 也能直接运行
为什么能够在系统中找到对应的指令呢?事实上系统中存在一个环境变量PATH,它能够去检索对应的指令,找到了就会去执行,找不到就会像上面一样提示not found,因此我们如果想用另一种方式去直接执行文件,就可以将这个文件路径添加到环境变量PATH中。
当我们查看PATH变量时,每一个:所间隔的就是一个检索的路径,因此只要把想直接执行的文件的路径也添加到这个里面,就能够检索到从而执行。
可以看到一些系统中的指令例如: ls就是将自己的路径添加到环境变量PATH中
易错点:
export PATH=/home/yj/107/lesson12 也可以添加到PATH中, 但是PATH中其他路径就被覆盖了, 导致一些系统指令无法执行, 出现这种情况只要重新登录即可恢复过来,因为这些环境变量是保存在内存中的,属于内存中的环境变量。
用法:
export PATH=$PATH:/home/yj/107/lesson12
就可以将这个指令追加到PATH环境变量中。
export: 设置一个新的环境变量
- PATH : 指定命令的搜索路径
- HOSTNAME:主机名
- HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
- USER:当前用户名
- SHELL : 当前Shell,它的值通常是/bin/bash。
1.echo: 显示某个环境变量值
2.export: 设置一个新的环境变量
3.env: 显示所有环境变量
4.unset: 清除环境变量
5.set: 显示本地定义的shell变量和环境变量
显示某个环境变量值
显示所有环境变量
我们通过env命令,就可以显示这些所有的环境变量,事实上是可以通过代码来实现的
export: 设置一个新的环境变量
set: 显示本地定义的shell变量和环境变量
unset: 取消本地变量和环境变量
environ 变量是一个char** 类型,存储着系统的环境变量
上面演示了几种不同的获取环境变量的方法: 通过命令行参数 envp, 全局变量environ,可是无论哪一种使用都是遍历数组来获取, 能不能直接去获取呢? 可以调用函数去获取
推荐的getenv获取环境变量,因为可以指定获取。
通过getenv获取环境变量PWD, 实现自己的PWD指令:
#include<stdio.h>
#include<stdlib.h>
int main()
{
char*pwd=getenv("PWD");
if(pwd==NULL)
perror("getenv");
else
printf("%s\n", pwd);
return 0;
}
写好后, 这个文件路径添加到环境变量PATH中,就可以实现像pwd一样的功能
环境变量是可以被相关子进程继承下去的, 环境变量具有全局性
如: 定义一个 export hello=“youcanseeme” 相当于把这个环境变量设置进了shell内部
写代码观察子进程是否继承了这个环境变量
观察发现子进程继承了这个环境变量
通过export可以把这个本地变量添加到环境变量表中
大家回想一下,有的编译器中的main函数中存在着这样的参数:
比如上面的DevC++中,main()中有着整形的argc参数和指针数组的argv参数, 事实上,这两个参数这就是命令行参数。
argc保存命令行的选项数目, char*argv[]和环境变量一样也是一张表结构, 保存命令行选项的地址
我们可以发现,所打印的结果,就是对应的命令行中的命令以及选项
第三个参数: 可以用来获取环境变量
char*envp[]
本质是一个指针数组,因为环境变量实际上也都是一个个的字符串,而最后一个字符串(无效内容)实际上就是NULL,因此我们可以在编辑代码时可以用这个作为截止条件:
写1个可以根据不同选项程序执行不同的功能的程序如下:
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<stdlib.h> #include<unistd.h> //运行程序必须带一个参数选项, 并且可以根据不同选项程序执行不同的功能 void Usage(const char*name) { printf("\nUsage: %s -[a|b|c]\n\n",name); exit(0); //终止进程 } int main(int argc, char*argv[]) { if(argc != 2) Usage(argv[0]); if(strcmp(argv[1],"-a")==0) printf("打印当前目录下的文件\n"); else if(strcmp(argv[1],"-b")==0) printf("打印当前目录下的文件的详细信息\n"); else if(strcmp(argv[1],"-c")==0) printf("打印当前目录下的文件名(包含隐藏文件)\n"); else printf("其他功能, 待开发\n"); retrun 0; }
通过上面的描述,我们知道,环境变量就是操作系统启动之后将内部内容加载到内存中的变量,也就是全局变量。通过环境变量,我们可以对一些所需要的环境进行配置。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。