引例
在linux系统中,我们使用ls命令,直接在命令行中输入ls。即可列出当前目录内容。我们可以在/usr/bin/目录下找到ls的可执行文件。如下图:
看一看下面这种情况:
为什么上面两个"不同"命令实现的功能一样呢?
原因就是环境变量搞的鬼!因为我们平常输入的ls本质上其实就是该目录下的可执行文件。我们输入ls时,命令行通过“环境变量里的路径”自动帮我们找到了该文件!
为了验证这种情况?我们查看以下当前的环境变量:
echo $PATH
可以看到当前环境变量里面有==/usr/bin/==该路径,我们输入ls时,自动会根据路径去找相关可执行文件。
环境变量
一般是指在操作系统中用来指定操作系统运行环境的一些参数。环境变量通常具有某些特殊的用途,并且通常具有全局属性。
常见的环境变量
- PATH:指定命令的搜索路径
- HOME:指定用户的主工作目录
- SHELL:当前Shell,通常是/bin/bash
echo
查看环境变量
echo $环境变量名
如下例子:
echo $PATH && echo $HOME /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/xty/.local/bin:/home/xty/bin /home/xty
export
修改环境变量
用法:export PATH=
相当于赋值操作,使用:分割开。
示例:
export PATH=$PATH:/home/xty/cplusplus/linux/1027 解释:将PATH修改为$PATH(原来的环境变量)+自己新设置的路径。(注意路径中不能有. 否则会当成当前路径)
而该路径下有一个可执行文件,即我们自己写的c语言文件。
以前我们需要如上面执行自己的文件,而现在我们不需要这样了。
见证奇迹的时刻!如下所示:
我们仅仅输入文件名即可运行该程序,这就是环境变量的作用!
env
显示所有环境变量
unset
删除变量或函数
unset [-选项] 名字
f:函数
v:变量
set
显示本地定义的shell变量和环境变量。
通过代码获取环境变量
int main(int argv, char* argv[], char *env[])
第一个参数:代表传入命令行参数的个数。
第二个参数:存储着指向命令行参数的指针。大小为argv
第三个参数:储存着系统的环境变量。
使用第三个参数获取
1 #include<stdio.h> 2 3 //通过第三个参数获取环境变量。 4 int main(int argc, char *argv[], char *env[]) 5 { 6 printf("begin.............\n"); 7 8 int i; 9 for(i = 0; env[i]; i++) 10 { 11 printf("env[%d]:%s\n",i,env[i]); // 打印环境变量 12 } 13 14 printf("end.................\n"); 15 16 17 18 return 0; 19 }
使用全局变量enviorn获取环境变量
如上图,这些环境变量存在environ中,存的是指向环境变量的指针。
示例:使用全局变量也可以获得环境变量。
1 #include<stdio.h> 4 int main(int argc, char *argv[]) 5 { 6 printf("begin.............\n"); 7 8 extern char **environ;//声明全局变量 9 int i = 0; 10 for(; environ[i];i++) 11 { 12 printf("%s\n",environ[i]); 13 }
通过系统调用获取环境变量
系统调用函数
getenv(环境变量名称)
运行示例:
1 #include<stdio.h> 2 #include<stdlib.h> 4 int main(int argc, char *argv[]) 5 { 6 7 printf("%s\n",getenv("PATH")); 8 printf("%s\n",getenv("HOME")); 9 return 0; 10 } //输出结果 /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/xty/.local/bin:/home/xty/bin /home/xty
环境变量具有全局属性
- 子进程可以继承父进程的父进程的环境变量。
例子:为什么我们能通过char *env[],获取环境变量? - 因为我们写的test程序是由父进程(bash)创建的,那些环境变量都是父进程(bash)的,子进程给继承过来了,表面上我们什么都没传,实际上父进程给我们自动传过来了。
- 环境变量具有全局属性。
通过export设置的环境变量都具有全局属性。
看一下代码:
1 #include<stdio.h> 2 #include<stdlib.h> 4 int main(int argc, char *argv[]) 5 { 6 7 printf("%s\n",getenv("XTYY")); //获取XTYY环境变量 8 9 printf("\n"); 10 }
起初我没有设置XTYY环境变量,我们什么也没有得到。后来我通过export设置后,再次运行程序,发现获得了环境变量。因此可以证明环境变量具有全局属性。
main函数前两个参数的作用
int main(int argv, char* argv[])
第一个参数:代表传入命令行参数的个数。
第二个参数:存储着指向命令行参数的指针。大小为argv
有一段示例程序可以解释这些参数的作用,
示例一:
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #include<unistd.h> 5 6 7 8 int main(int argc, char *argv[]) 9 { 10 if(argc != 2) 11 { 12 printf("Usage: %s 至少要有一个选项\n", argv[0]); 13 return 1; 14 } 15 16 if(strcmp("-a", argv[1]) == 0) 17 { 18 printf("这是功能一\n"); 19 } 20 else if(strcmp("-b", argv[1]) == 0) 21 { 22 printf("这是功能二"); 23 } 24 25 return 0; 26 } 27
通过上面的例子我们可以看出,执行程序后,命令行的选项,被存到了argv的数组中,从而实现不同功能的作用。
示例二:
8 int main(int argc, char *argv[]) 9 { 10 printf("argc = %d\n",argc); 11 12 int i = 0; 13 for(; i<argc; i++) 14 { 15 printf("%s ",argv[i]); 16 } 17 printf("\n"); 18 }
可以看出,argc代表着选项的数量;argv[0],代表命令;其余代表选项。
以上就是环境变量相关知识,后续还会继续补充,请期待。