环境变量概念
理解:环境变量,不是一个,而是一堆,彼此之间没有关系,一般是系统内置的具有特殊用途的变量。本质上就是系统自己开辟的空间,给它变量名和变量内容。
比如:我们在编写C/C++代码的时候,在链接的时候,我们不知道所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
比如:我们进入公司,公司会花费一些费用(开辟空间),给我们准备一些东西,如:工牌,工位,通过工牌就能找到我们的姓名,工号,部门等一些信息(环境变量),这样就可以将每个员工身份信息记录下来。
在Linux中,系统就提前创建了一些变量(环境变量)。如:环境变量PATH记录了我们的指令的路径,环境变量USER记录了登录的用户,环境变量PWD记录着我们所在的路径等
环境变量相关的命令
1. echo: 显示某个环境变量值
2. export: 设置一个新的环境变量
3. env: 显示所有环境变量
4. unset: 清除环境变量
5. set: 显示本地定义的shell变量和环境变量
使用:set
注:本地变量与环境变量不同,环境变量可以被子进程继承,本地变量不会被子进程继承,这个后文有说明。
命令行参数
main函数带参数
第二个参数是指针数组,第一个参数指示的是第二个数组的元素个数.
int main(int argc, char* argv[])//第二个参数是指针数组,第一个参数指示的是第二个数组的元素个数
{
return 0;
}
打印一下
#include<stdio.h>
int main(int argc, char* argv[])
{
for (int i = 0;i < argc;i++)
{
printf("argv[%d]:%s", i, argv[i]);
}
return 0;
}
结果:
观察发现,直接运行程序时,argv数组的第一个元素存储的是我们在命令行输入的字符串,随着我们在后面输入其他字符(以空格隔开),argv中保存的元素也随之变化。
原因: 本质上命令一个程序,bash将我们输入的命令行字符串存储到argv这个数组中,存储元素的个数记在argc中,在运行程序时程序(执行命令)时,argv[0]中存的是命令名称,argv[1]存储的是选项
这个有什么用?我们可以通过不同选项,让我们的同一个程序执行它内部不同的功能。
例子:
1 #include<stdio.h>
2 #include<string.h>
3 int main(int argc ,char* argv[])
4 {
5 if(argc!=2)//命令行中输入的变量多余两个时
6 {
7 printf("error\n");
8 return 0;
9 }
10 if(strcmp("-1",argv[1])==0)//输入选项-1时
11 {
12 printf("function 1\n");
13 }
14 else if(strcmp("-2",argv[1])==0)//输入选项-2时
15 {
16 printf("function 2\n");
17 }
18 else//其他选项
19 {
20 printf("no function\n");
21 }
22 return 0;
23 }
结果:
我们可以像命令那样,根据不同的选项执行不同的功能。
main第三个参数
系统会将环境变量以main函数的参数的方式传入进程中。
int main(int argc, char* argv[],char* env[])
{
}
我们把env数组打印一下观察结果:
int main(int argc, char* argv[],char* env[])
{
for (int i = 0;env[i];i++)
{
printf("env[%d]:%s", i, env[i]);
}
return 0;
}
结果:
系统会将环境变量以main函数的参数的方式传入该程序(这里只mytest)所产生的进程中。
那么环境变量从哪来?
父进程中!这里的父进程是bash。
bash将环境变量表传给mytest的main函数中
环境变量具有全局属性,可以被所有子进程继承。(本地变量不会被子进程继承)
那bash的环境变量从哪里来?
所有的环境变量是从文件中读取的。
getenv手动传入环境变量
若子进程main函数中没有直接传env这个参数,也可以用如下这种方式获取环境变量。
getenv:直接通过环境变量的名字获取环境变量,在头文件stdlib.h中
const char* username = getenv("USER");//加在程序里
这样相比直接在main中传入env参数的好处是,这种方法可以指定获取哪个环境变量,更加可控。
应用:
1 #include<stdio.h>
2 #include<string.h>
3 #include<stdlib.h>
4
5 int main()
6 {
7 const char* username = getenv("USER");
8 if(strcmp(username,"syb")==0)
9 {
10 printf("permission pass\n");
11 }
12 }
如果用户是授权的,则允许访问。
常见环境变量举例
PATH环境变量
查看PATH环境变量PATH环境变量中保存了命令的搜索路径,我们每次使用指令时,其实是去PATH所储存的路径中寻找指令。
通过PATH我们解决了一些问题:
添加PATH环境变量将我们的程序所在路径加入环境变量PATH当中, export PATH=$PATH:mytest程序所在路径。//export PATH=$PATH:mytest程序所在路径 export PATH = $PATH:/home/syb/test-path
结果:
这样我们就直接可以使用我们自己创建的指令了。