Linux下的环境变量

前言

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性

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

一、main参数

在C语言中,main函数其实也有三个参数,第一个参数叫做int argc,第二个叫做char* argv[],前者代表后者的字符串个数,第三个是环境变量,使用以下代码打印参数具体内容

#include <stdio.h>

int main(int argc,char*argv[],char *env[])
{
  int i =0;
  for(;i<argc;i++){
    printf("%s\n",argv[i]);
  }
return 0;
}

通过运行结果发现,它储存的内容是输入在bash里面的字符串

其实质是bash会获取用户输入在命令行中的内容,然后根据空格分隔转换为多个字符子串,通过一定的方法传给main函数,其目的是根据用户输入的不同选项让同一个程序执行对应的功能,例如:ls和ls -l运行的程序是相同的,都是ls,但是由于其选项不同,其运行结果却是不同的,命令行参数是指令的基础

二、环境变量

环境变量有很多,之间没有什么联系

环境变量是系统内置的具有特殊用途的变量,就是操作系统开辟的一块内存空间

查看环境变量

通过以下命令可以查询到配置的环境变量

$echo $PATH

由结果可知,环境变量由一条条字符串组成 

 程序路径问题

[root@hcss-ecs-e53a test2]# mybin
-bash: /usr/bin/mybin: No such file or directory
[root@hcss-ecs-e53a test2]# ./mybin 
./mybin

在Linux下面运行自己的程序时,必须加上路径,否则无法运行,而运行系统的指令时,却不需要,这是因为系统在创建进程的时候,必须先找到该可执行程序,然后才将其加载到内存中进而创建PCB对象,系统会去/usr/bin目录下面找,系统自带的程序都在该目录下,而自己的程序不在该目录下面,所以会提示找不到该程序。

所以,想要不带路径直接搜索程序,则可将自己的程序添加到/usr/bin下面,如下

[root@hcss-ecs-e53a test2]# cp mybin /usr/bin
[root@hcss-ecs-e53a test2]# mybin
mybin

或者是将存放自己程序的目录添加到PATH环境变量里面去

[root@hcss-ecs-e53a test2]# PATH=/home/yw/class/test2:$PATH
[root@hcss-ecs-e53a test2]# $echo $PATH
-bash: /home/yw/class/test2:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/bin/vim:/root/bin:: No such file or directory
[root@hcss-ecs-e53a test2]# mybin
mybin

 注意:

环境变量是操作系统/bash在开机时根据配置文件开辟的一块内存空间,在重新连接bash或者是重新开机后,以上方式配置的环境变量又会被初始化,其原因是bash的环境变量来自于磁盘里的脚本和配置文件,在bash进程开启后,会从磁盘中获取环境变量保存到内存中,在每个用户的家目录下面,都存在一个叫做bash_profile的配置文件,在bash进程开启时,会读取该文件

三、环境变量的操作与特性

操作

1)echo $环境变量名称

作用:展示环境变量的内容

2)env

作用:展示当前所有的环境变量

3)export 环境变量=值

作用:新建环境变量

[root@hcss-ecs-e53a test2]# export AGE=21
[root@hcss-ecs-e53a test2]# env

特性

全局性

在main函数里面main函数还有第三个参数env,使得在main函数中可以直接获取系统的环境变量

#include <stdio.h>
int main(int argc,char*argv[],char*env[])
{
  for(int i=0;env[i];i++){
    printf("------env[%d]->%s\n",i,env[i]);
  }
}

环境变量由父进程bash给main函数传递,换言之,bash里面已经存在了一张环境变量表,在创建子进程的时候,环境变量默认是可以被所有的子进程继承的,所以环境变量具有全局性。

四、环境变量的获取与设置

获取环境变量

1)通过main参数获取

#include <stdio.h>
int main(int argc,char*argv[],char*env[])
{
  for(int i=0;env[i];i++){
    printf("------env[%d]->%s\n",i,env[i]);
  }
}

2)通过函数接口获取

传入环境变量名字,就可以获取其值,该方法为最常用的方法

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main(){
  printf("PATH--->%s\n",getenv("PATH"));
  return 0;
}

3)通过第三方变量获取

#include <stdio.h>

int main(){
  extern char**environ;
  int i=0;
  for(;environ[i];i++){
    printf("%s\n",environ[i]);
  }
  return 0;
}

在此例中,通过外部变量environ二级指针获取环境变量,然后逐步打印环境变量

删除环境变量

unset 环境名

 

五、环境变量与本地变量

根据上文可知,在bash中,可以通过export定义一个变量,该变量称为环境变量

[yw@hcss-ecs-e53a test3]$ export b=11

可以通过env获取到

可以直接定义一个变量,该变量称为本地变量

[yw@hcss-ecs-e53a test3]$ a=1

该变量无法通过env获取,需要通过set获取

使用set可以获取到所有环境变量和一些非环境变量

 获取到的非环境变量就叫做本地变量

本地变量只能供给本进程使用(此处是bash),不会继承给子进程

通过以下代码可以验证

#include <stdio.h>
#include <stdlib.h>
int main(){
  char* ret= getenv("a");
  if(ret)
    printf("ret = %s\n",ret);
  else 
    printf("ret is NULL\n");
  return 0;
}

 在子进程中,无法获取bash进程的本地变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值