『 Linux 』环境变量(上)https://developer.aliyun.com/article/1424465
🚀通过代码获取环境变量🚀
除了以命令行的形式echo $变量名
,env
获取环境变量以外也可以通过程序,即以代码的形式获取环境变量;
🕹️main函数的形参🕹️
实际上在main
函数当中也有三个形参,分别为:
int argc
向main函数传递的参数个数;char *argv[]
代表执行的程序名称和执行程序时输入的参数;char *env[]
环境变量信息;
int main(int argc , char *argv[] , char *env[]) {;}
其中int argc
与char *argv[]
都为命令行参数;
🎮 命令行参数
在main()
函数的参数当中,其中int argc
与char *argv[]
均为命令行参数;
可以通过这两个参数实现程序在不同的指令下做到不同的运行结果;
存在一个程序(mytest):
#include<iostream> using namespace std; int main(int argc , char *argv[] , char *env[]) { for(int i = 0;i<argc;++i){ printf("argv[%d]:%s\n",i,argv[i]); } return 0; }
运行结果:
$ ./mytest -a -b -c -d -e -f argv[0]:./mytest argv[1]:-a argv[2]:-b argv[3]:-c argv[4]:-d argv[5]:-e argv[6]:-f
可根据该运行结果配合Linux中类似于ls -a
等命令进行联想;
🎮 利用main函数的第三个参数 – char * env[]获取环境变量
该参数的类型为一个指针数组类型,一个数组内所存储的数据都为char*
的指针;
而这个形参即为启动该进程的进程(即这个进程的父进程)传给该进程的环境变量信息;
可以推断出这个指针数组内的char*
指针实际上为字符串,而启动该进程的进程将环境变量信息以字符串的形式传递给该进程;
可以使用一个程序进行证明 (以字符串的形式打印环境变量);
存在一个程序(mytest):
#include<iostream> using namespace std; int main(int argc , char *argv[] , char *env[]) { for(int i = 0;env[i];++i){ cout<<env[i]<<endl; } return 0; } /* * env[]为指针数组; * 遍历该数组并以字符串的形式打印出每个char*字符串; */
在Linux下环境变量一般是以字符串的形式利用指针数组进行存储,并以指针数组的形式将其传递给main
函数;
🎮 环境变量全局性的证明
实际上在一个程序当中,main()
函数当中的char*env[]
中的环境变量信息来自于其父进程;
即也验证了这个形参即为启动该进程的进程(即这个进程的父进程)传给该进程的环境变量信息;
验证:
- 存在一个程序(mytest):
#include<iostream> using namespace std; int main(int argc , char *argv[] , char *env[]) { for(int i = 0;env[i];++i){ cout<<env[i]<<endl; } return 0; }
- 可以使用该程序获取当前的所有环境变量;
通过该程序配合| grep
可以查看该程序所接收的众多环境变量中的部分环境变量; - 设置临时环境变量:
在该对话中并不存在一个MYTEST
的环境变量;
所以如果运行该程序并配合| grep MYTEST
也将不会有对应的结果;
$ ./mytest | grep MYTEST $
- 使用
export
命令设置一个临时的环境变量,且该环境变量的值为hello_world
;
$ export MYTEST=hello_world
- 再次运行程序同时再次使用
| grep MYTEST
搜索该环境变量:
当再次搜索该环境变量时则可以找到;
$ ./mytest | grep MYTEST MYTEST=hello_world
由于根据该程序中所打印的环境变量都是由main()
函数的第三个参数char *env[]
进行打印的;
由此可以推断出该程序的环境变量是由其父进程所传递,对应的来说一个进程①在运行另一个进程②时,进程①会将自身的环境变量传给进程②;
同时也可以得出一个结论:
环境变量将从配置文件开始以多叉树的形式分发给每一个进程(父子进程间环境变量的传递),因此可以认为环境变量是具有全局属性的;
🕹️利用全局变量 char **environ获取环境变量🕹️
同时在Linux中除了该种方式可以获取环境变量以外,还拥有一个全局的环境变量char** environ
,且其对于获取环境变量所调用的方式与使用main()
函数的第三个参数char *env[]
所调用的方式相同;
示例:
#include<iostream> using namespace std; int main(int argc , char *argv[] , char *env[]){ extern char **environ; for(int i = 0;environ[i];++i){ cout<<environ[i]<<endl; } }
由于environ
并不包含与任何头文件,所以在使用该全局变量前必须使用extern
进行声明;
🕹️利用getenv()函数获取环境变量🕹️
getenv()
函数是包含于头文件中的一个函数;
该函数能够通过所给的环境变量(字符串)返回对应的环境变量数据;
其语法为:
char *getenv(const char *name);
示例:
#include<iostream> using namespace std; int main(int argc , char *argv[] , char *env[]) { cout<<getenv("PATH")<<endl; return 0; }
调用:
$ ./mytest /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/_user/.local/bin:/home/_user/bin
通常来说大部分情况使用该方式获取对应的环境变量的所使用的频率要高于上面的两种;
其中最主要的原因是若是使用上面的两种方式获取环境变量则将会有大量的环境变量以字符串的形式进行展现,需要使用者进行二次甄别;
🚀Linux中的环境变量与全局变量🚀
在上文中所提到的都为环境变量;
而在Linux中不仅可以定义环境变量还可以定义全局变量;
- 环境变量的定义:
export var_name=_value
- 示例:
$ export Test1=hello_world # 设置环境变量 $ echo $Test1 # 使用echo打印变量 hello_world $ env | grep Test1 # 可以使用env显示所有环境变量,配合grep显示出对应的环境变量 Test1=hello_world
- 局部变量的定义:
var_name=_value
- 示例:
$ Test2=HELLO_WORLD # 设置环境变量 $ echo $Test2 # 使用echo打印变量 HELLO_WORLD $ env | grep Test2 # 可以使用env显示所有环境变量,配合grep显示出对应的环境变量 $ # 无结果显示
🕹️使用set显示变量🕹️
在Linux当中可以使用set
显示所有的变量 (包括局部变量与环境变量);
$ set | grep Test1 Test1=hello_world $ set | grep Test2 Test2=HELLO_WORLD