[Linux]环境变量

[Linux]环境变量

文章目录

环境变量的概念

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。

环境变量的本质:一张内存级的表,在用户登录系统的时候,为用户形成属于自己的环境变量表。表结构示意图如下:

环境变量是从配置文件中读取获得的。

每一个环境变量都有自己的用途,有的是用于路径搜索,有的是用于身份认证,有的是用于库的查找等等。

查看环境变量

  1. Linux系统下输入env指令查看所有环境变量

其中一些常见的环境变量:

  • SHELL : 当前Shell,它的值通常是/bin/bash
  • USER:当前用户名
  • PWD:当前用户所处的路径
  • HOME:当前用户的家目录
  • LOGNAME:用户登录时的名字

环境变量中值得注意的是PATH环境变量,他记录了Linux系统中的系统指令程序路径,编程语言的动静态库地址。因此同样是可执行程序我们自己编写的程序需要加路径运行,而系统指令不用,并且编译代码时,不需要关心动静态库的链接问题,因为环境变量中记录了路径,编译器会根据环境变量的路径查找。

  1. Linux系统下输入echo $NAME 指令查看特定环境变量,其中NAME是所要查看的环境变量名

说明: 一些特定的环境变量比如LOGNAME不同的用户的环境变量是不同的。

  1. 编写代码查看环境变量
  • 通过main函数的参数查看

main函数是有三个参数的,即使我们不写明,编译器也在编译时自动加上并接收参数,其中第三个参数是一个名为envp的指针数组,其接收的参数就是环境变量。envp的数据中最后一个有效数据的下一个数据是空指针,因此编写如下代码查看环境变量:

c 复制代码
#include <stdio.h>
#include <unistd.h>

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

编译后运行程序查看结果:

  • 通过全局变量查看

在Linux系统头文件unistd.h中有一个全局变量,名为environ的二级指针,指向环境变量数据表,environ的数据中最后一个有效数据的下一个数据是空指针。因此编写如下代码查看环境变量:

c 复制代码
#include <stdio.h>
#include <unistd.h>

int main()
{
  extern char** environ; //变量声明
  int i = 0;
  for (i = 0; environ[i]; i++)
  {
    printf("environ[%d]->%s\n", i, environ[i]);
  }
  return 0;
}

编译后运行程序查看结果:

  • 调用系统函数查看

Linux系统提供了系统函数getenv来获取特定的环境变量。因此编写如下代码查看环境变量:

c 复制代码
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
  char* usr = getenv("USER");
  printf("当前用户名为:%s\n", usr);
  return 0;
}

getenv函数所在的头文件是stdlib.h,参数要查看的特定环境变量,编译后运行程序查看结果:

环境变量的加载原理

环境变量是从系统配置文件获取数据的一张内存级的表,在Linux操作系统下每启动一个shell进程,shell进程内部就会执行创建环境变量表的代码,然后从配置文件中获取数据加载到自身创建的环境变量表中。由于我们使用Linux操作系统都是通过shell进行命令行解释然后启动子进程完成功能,因此在Linux操作系统下启动的进程都可以通过main函数的参数获取到环境变量,如下:

说明:

  • 修改某个shell进程自身的环境变量表不影响新启动的shell进程。
  • 修改所有新启动的shell进程的环境变量需要修改配置文件。

环境变量的添加

  1. 给当前shell进程添加本地变量

直接输入NAME=VAL给当前shell进程添加本地变量:

shell进程的本地变量只在shell进程内部有效,由shell启动的子进程都无法接收到本地变量。为了验证子进程无法接收到该本地变量编写如下代码:

c 复制代码
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
    char* env = getenv("HELLO");
    if (env) printf("%s\n", env);
    else printf("该环境变量不存在\n");
    return 0;
}

编译运行程序查看结果:

  1. 给当前shell进程添加全局变量

输入export 本地变量或者export NAME=VAL添加全局变量:

export指令会将变量添加到shell进程的环境变量表中,因此shell进程的全局变量可以由shell启动的子进程都接收。(图中myproc进程代码同上)

刷新环境变量

.操作符

. 配置文件名 可以刷新当前shell进程的环境变量,将配置文件中的数据加载到环境变量表中使其生效。

source命令

source 配置文件名可以刷新当前shell进程的环境变量,将配置文件中的数据加载到环境变量表中使其生效。

配置文件的路径

在Linux系统家目录下的每个用户目录中都会存在两个配置文件.bash_profile.bashrc

.bash_profile.bashrc文件中都有一些环境变量和加载其他配置文件的shell脚本,shell脚本的功能是到对应的路径下加载配置文件,为用户创建shell进程时就会先加载.bash_profile.bashrc文件然后执行其中的shell脚本完成环境变量的加载。

.bash_profile内容示意图:

.bashrc内容示意图:

相关推荐
落笔画忧愁e3 分钟前
FastGPT快速将消息发送至飞书
服务器·数据库·飞书
小冷爱学习!10 分钟前
华为动态路由-OSPF-完全末梢区域
服务器·网络·华为
技术小齐1 小时前
网络运维学习笔记 016网工初级(HCIA-Datacom与CCNA-EI)PPP点对点协议和PPPoE以太网上的点对点协议(此处只讲华为)
运维·网络·学习
ITPUB-微风1 小时前
Service Mesh在爱奇艺的落地实践:架构、运维与扩展
运维·架构·service_mesh
打不了嗝 ᥬ᭄1 小时前
Linux的权限
linux
落幕1 小时前
C语言-进程
linux·运维·服务器
深度Linux1 小时前
C++程序员内功修炼——Linux C/C++编程技术汇总
linux·项目实战·c/c++
chenbin5202 小时前
Jenkins 自动构建Job
运维·jenkins
java 凯2 小时前
Jenkins插件管理切换国内源地址
运维·jenkins
AI服务老曹2 小时前
运用先进的智能算法和优化模型,进行科学合理调度的智慧园区开源了
运维·人工智能·安全·开源·音视频