环境变量
一般指的是在操作系统上运行环境的一些参数。我们在编写C/C++代码时,在链接的时候,用户并不知道所链接的动静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关的环境变量去帮助编译器去查找。环境变量通常具有某些特殊用途,在系统当中具有全局属性。
PATH
指定命令的搜索路径,所谓的指令其实就是一个可执行程序,而这个可执行程序统一被放置在一个路径/usr/bin下面,也就是说,当我们把某一路径添加到PATH后,系统会自动从这些路径中去找寻对应的可执行文件并运行
可以看见当我们修改了PATH,去掉了/usr/bin之后,指令ls无法运行了,只有当指定了绝对路径之后才能继续运行
注意:普通用户修改环境变量时只有本次登录生效,重新登录后,PATH会恢复,这是因为PATH这个环境变量,它是有备份在系统的,当系统启动的时候,会给PATH重新赋值(也就是重新加载一遍配置文件),而这个备份(配置文件)就在家目录的.bash_profile中
USER
显示当前账号
SHELL
显示默认的命令行解释器
HOME
显示的是指定用户的主工作目录(即用户登录到Linux系统的默认目录)
查看系统的全部环境变量:env,set
- set:set命令显示当前shell的所有变量,包括环境变量、本地变量以及shell特有的变量。这些变量不仅局限于用户的环境变量,还包括与shell会话相关的其他信息,如shell的功能选项和状态信息。
- env:env命令仅显示环境变量,也就是那些被导出供子进程使用的变量。这些变量通常包括系统路径、用户信息等,对于定义程序运行环境至关重要。
重新认识main函数
#include<stdio.h>
int main(int argc, char* argv[], char* envp[])
{
int i=0;
printf("argc:%d\n",argc);
printf("----------------------------------\n");
for(i=0;i<argc;i++) printf("argv[%d]:%s\n",i,argv[i]);
printf("----------------------------------\n");
for(i=0;envp[i];i++) printf("envp[%d]:%s\n",i,envp[i]);
return 0;
}
main函数原本是有三个参数:argc:表示的是传入程序的元素数量,argv:传入程序中的元素表,由bash制作,传给main函数,envp[]环境变量表,所谓全局性就是指main函数通过此参数获取到的环境变量表的信息,也就是env显示的环境变量(最后一个环境变量是当前的运行可执行文件的路径)
环境变量表
在每个进程启动的时候都会收到一个环境遍历表,用于记录与当前进程有关的环境变量信息,这个环境变量表采用的是字符指针数组的形式进行存储,然后使用全局变量char** envrion来记录环境变量表的首地址,使用NULL来表示环境表的末尾:
#include <stdio.h>
#include <unistd.h>
int main(int argc, char* argv[])
{
extern char **environ;
int i=0;
for(i = 0; environ[i]; i++)
{
printf("environ[%d] -> %s\n", i, environ[i]);
}
return 0;
}
结论:main函数的形参列表中写成的char* envp[]形式本质上是一个二级指针,也就是environ,而环境变量具有全局属性,程序运行时,环境变量表会传递给程序使用
环境变量的全局性:环境变量的本质上就是内存级别的一张表,这张表在用户登录系统的时候,由系统给用户单独形成,每一个环境变量都有不同的作用,许多的环境变量存储着用户的个人信息,不同的用户的环境变量表各不相同。
获取特定环境变量:getenv()
#include <stdio.h>
#include <unistd.h>
#include<assert.h>
#include<stdlib.h>
int main()
{
char *PWD=NULL;
PWD=getenv("PWD");
assert(PWD!=NULL);
printf("%s\n",PWD);
return 0;
}
本地变量
当用户登录Linux系统时,操作系统会自动给用户创建一个shell,用来为该用户提供命令行解释。shell本身是一个进程,会在shell中维护一张环境变量表。而用户在执行命令时,都是命令行解释器shell帮用户执行,对应到Linux系统下,就是bash在执行。bash除了可以执行命令外,还可以命令行式的自定义变量:
在命令行中写下指令 my=100 后,shell读取到指令,就会在内存中申请一块空间,并把该变量以字符串 "my=100" 的形式存放进去,最后在shell内部另外生成一个指针指向该字符串。
myval 是在命令行中定义的,只是前面没有加上 export ,所以 myval 虽然存在,但是并没有被导入表状结构中,这种变量被称为本地变量。
环境变量相对也就是本地变量,针对当前用户的当前进程生效,是一种临时变量,退出本次登陆后就失效了。
结论:本地变量只在当前的bash进程,也就是shell会话内部生效,并不被子进程所继承,也就是说本地变量与环境变量相比,不具备全局属性,而要想本地变量具备全局属性,就得把它定义为环境变量。
标签:shell,变量,用户,include,本地,main,环境变量 From: https://blog.csdn.net/2301_79991997/article/details/143486572