[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内容示意图:

相关推荐
lingran__22 分钟前
Linux 基础常用指令万字详解(上)|文件目录命令,结合底层原理剖析
linux·运维·服务器·后端·centos·linux基础指令
轻揉小乔 真新人1 小时前
T-SQL查询进阶—理解SQL Server中的锁
服务器·数据库·sql
各类产品分享1 小时前
电力行业AR智能运维哪个品牌好
运维·ar·ar巡检
Dlrb12111 小时前
Linux驱动---sys文件系统自动添加设备节点、添加调试节点以及MISC设备驱动的解释
linux·imx6ull·misc·设备节点·sys文件系统
贾天佑忆月 迷失的昵1 小时前
客户端与服务器持续同步解析(轮询,comet,WebSocket)
运维·服务器·websocket
刘某的Cloud2 小时前
Galera Cluster mariadb 生产环境常见问题排查与运维指南
linux·运维·数据库·mariadb·集群高可用
70asunflower2 小时前
Linux 性能排查分析完全教程
linux·运维
zhangfeng11332 小时前
宝塔8 升级到 11导致 服务器无法访问外网dns失效了,无法访问bt.cn 解决方法 测试通过
运维·服务器
兵bing3 小时前
Docker Compose 配置文件归纳总结-千问
运维·docker·容器
dok123 小时前
Johannes 《Linux内核模块与设备驱动开发:编写Linux驱动程序》 (11)kmalloc 动态内存分配和struct file中的私有数据
linux·驱动开发·算法