『 Linux 』环境变量(下)

简介: 『 Linux 』环境变量(下)

『 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 argcchar *argv[]都为命令行参数;


🎮 命令行参数

main()函数的参数当中,其中int argcchar *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


相关文章
|
4月前
|
Linux Shell
入职必会-开发环境搭建36-Linux常用操作-Linux环境变量
环境变量的作用是指定到哪个目录去找你输入的命令执行。环境变量的设置分为:临时设置和永久设置两种。
|
4月前
|
Java Linux
linux 对子用户配置java 环境变量
linux 对子用户配置java 环境变量
34 3
|
3月前
|
Linux Shell
在Linux中,如何设置环境变量?
在Linux中,如何设置环境变量?
|
3月前
|
Shell Linux
在Linux中,什么是环境变量?如何设置和查看环境变量?
在Linux中,什么是环境变量?如何设置和查看环境变量?
|
4月前
|
Linux
Linux环境变量及作用
Linux中的环境变量是系统配置参数,如HOME指示用户家目录,MAIL指邮件位置。`env`命令显示所有环境变量。系统有数百个变量,但了解关键的几个足够,如PATH、HOME、TERM等。环境变量由变量名和值组成,可自定义,如WORKDIR。局部变量需用`export`使其全局有效,以便其他用户使用。`su`命令用于切换用户,展示不同用户环境下变量值的差异。
Linux环境变量及作用
|
4月前
|
Ubuntu Linux Shell
Ubuntu/linux系统环境变量配置详解
理解和掌握如何配置环境变量对于使用和管理Ubuntu/Linux系统非常重要。
240 2
|
5月前
|
关系型数据库 MySQL Shell
【权限提升】Linux系统&环境变量&定时任务&权限配置不当&MDUT自动化
【权限提升】Linux系统&环境变量&定时任务&权限配置不当&MDUT自动化
|
5月前
|
Linux Shell 编译器
Linux进程——Linux环境变量
Linux进程——Linux环境变量
34 3
|
4月前
|
Java Linux Shell
【Linux】深度解剖环境变量
【Linux】深度解剖环境变量
32 0
|
4月前
|
Shell Linux
Linux环境变量之shell中export定义全局变量和echo 变量的区别
Linux环境变量之shell中export定义全局变量和echo 变量的区别