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

相关推荐
正在走向自律29 分钟前
阿里云ESC服务器一次性全部迁移到另一个ESC
服务器·阿里云·云计算
gywl1 小时前
openEuler VM虚拟机操作(期末考试)
linux·服务器·网络·windows·http·centos
青木沐1 小时前
Jenkins介绍
运维·jenkins
WTT00112 小时前
2024楚慧杯WP
大数据·运维·网络·安全·web安全·ctf
苹果醋32 小时前
React源码02 - 基础知识 React API 一览
java·运维·spring boot·mysql·nginx
了一li2 小时前
Qt中的QProcess与Boost.Interprocess:实现多进程编程
服务器·数据库·qt
日记跟新中2 小时前
Ubuntu20.04 修改root密码
linux·运维·服务器
唐小旭2 小时前
服务器建立-错误:pyenv环境建立后python版本不对
运维·服务器·python
码农君莫笑2 小时前
信管通低代码信息管理系统应用平台
linux·数据库·windows·低代码·c#·.net·visual studio