欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > Linux下的环境变量

Linux下的环境变量

2025/2/10 20:48:49 来源:https://blog.csdn.net/m0_75262940/article/details/141095732  浏览:    关键词: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进程的本地变量

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com