Linux中的环境变量

环境变量概念 

        环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。

        理解:环境变量,不是一个,而是一堆,彼此之间没有关系,一般是系统内置的具有特殊用途的变量。本质上就是系统自己开辟的空间,给它变量名和变量内容。 

        比如:我们在编写C/C++代码的时候,在链接的时候,我们不知道所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。

        比如:我们进入公司,公司会花费一些费用(开辟空间),给我们准备一些东西,如:工牌,工位,通过工牌就能找到我们的姓名,工号,部门等一些信息(环境变量),这样就可以将每个员工身份信息记录下来。

        在Linux中,系统就提前创建了一些变量(环境变量)。如:环境变量PATH记录了我们的指令的路径,环境变量USER记录了登录的用户,环境变量PWD记录着我们所在的路径等

环境变量相关的命令

1. echo: 显示某个环境变量值
使用:echo  $环境变量

2. export: 设置一个新的环境变量
使用: export  环境变量 = 值
3. env: 显示所有环境变量
使用:env

4. unset: 清除环境变量
使用: 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我们解决了一些问题:

        为什么有些指令可以直接执行,不需要带路径,而我们的二进制程序需要带路径才能执行?
例:
        ls指令不需要指定路径就可以执行,而我们自己写的mytest就必须要指定路径。
原因: mytest没有加入到命令搜索路径中(没有加入到PATH环境变量中去)。
添加PATH环境变量
        将我们的程序所在路径加入环境变量PATH当中, export PATH=$PATH:mytest程序所在路径。
//export PATH=$PATH:mytest程序所在路径
export PATH = $PATH:/home/syb/test-path

结果:

这样我们就直接可以使用我们自己创建的指令了。

  • 18
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橘子13

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值