环 境 变 量

一、基本概念

环境变量是操作系统中用来保存配置信息和系统参数的变量,它们在程序运行时可用。就像你家里的温度、湿度一样,程序运行的环境也需要一些参数来指导它的行为。

特点:全局性、继承性、持久性


二、常见环境变量

PATH:指定命令的搜索路径

HOME:指定用户的主工作目录

SHELL:当前Shell,通常是/bin/bash

查看环境变量的方法:echo $NAME

bash 复制代码
echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
echo $HOME
/home/ypq
echo $SHELL
/bin/bash

三、和环境变量相关的命令

1.echo:显示某个环境变量的值

2.export:设置一个新的环境变量

3.env:显示所有的环境变量

4.unset:清楚环境变量

5.set:显示本地定义的shell变量和环境变量

1.搜索路径PATH

为什么在命令行中pwd能够直接使用,而code不能直接使用,二者明明都是文件?

原因在于pwd在搜索路径(PATH)当中,而code不在搜索路径(PATH)当中

首先我们获取环境变量中的PATH

bash 复制代码
[ypq@hcss-ecs-26b0 ~]$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

[ypq@hcss-ecs-26b0 ~]$ whereis pwd
pwd: /usr/bin/pwd /usr/include/pwd.h /usr/share/man/man1p/pwd.1p.gz /usr/share/man/man1/pwd.1.gz
[ypq@hcss-ecs-26b0 ~]$ whereis code
code: /home/ypq/code /home/ypq/code.c

通过whereis xxxx命令我们可知,pwd是在搜索路径中的,而code不在搜索路径中,这就是二者产生区别的原因,那么如果我们将code所在的路径添加到PATH中,是不是输入code后就能运行了,我们尝试一下~首先使用export指令补充PATH(注意是补充!)结果如下所示:

我们可以看到在命令行中code运行成功!

bash 复制代码
[ypq@hcss-ecs-26b0 ~]$ export PATH=$PATH:/home/ypq
[ypq@hcss-ecs-26b0 ~]$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/home/ypq
[ypq@hcss-ecs-26b0 ~]$ code
2
[ypq@hcss-ecs-26b0 ~]$ pwd
/home/ypq

四、环境变量的获取

1.代码

环境变量的组织方式

所有运行的程序(进程)都会从父进程 / 操作系统接收一份「环境表」,它是环境变量在程序内存中的核心组织形式,也是程序访问PATH/HOME等环境变量的直接入口。

环境表的本质是字符指针数组(char *envp[],核心特征如下:

  1. 数组元素 :每个元素是一个char*类型的指针,指向内存中一段以\0(空字符)结尾的「环境字符串」(格式:KEY=VALUE,如PATH=/usr/bin);
  2. 数组结束标志 :指针数组的最后一个元素固定为NULL,用于标记环境表的末尾(无额外长度字段,靠NULL判断边界);
  3. 内存布局:环境字符串是独立的内存块(只读 / 可写取决于系统),环境表仅存储指向这些字符串的指针,整体布局如下:
bash 复制代码
// 可视化内存结构
envp[0] → "PATH=/usr/bin:/bin\0"   // 环境字符串1(以\0结尾)
envp[1] → "HOME=/home/user\0"      // 环境字符串2
envp[2] → "LANG=en_US.UTF-8\0"     // 环境字符串3
...
envp[n] → NULL                     // 数组结束标志(关键)

命令行三个参数

C/C++ 程序可通过main函数的第三个参数直接获取环境表指针

cpp 复制代码
// 标准写法:argc=参数个数,argv=参数表,envp=环境表
int main(int argc, char *argv[], char *envp[]) 
{
    // 遍历环境表并打印所有环境变量
    for (int i = 0; envp[i] != NULL; i++) 
    {
        printf("%s\n", envp[i]); // 输出:KEY=VALUE格式的字符串
    }
    return 0;
}

第三方变量environ获取

main函数不声明envp参数,程序可通过全局变量extern char **environ访问环境表(由操作系统 /libc 提供):

cpp 复制代码
#include <stdio.h>
// 声明全局环境表指针(无需传入main参数)
extern char **environ;//environ没有包含在任意头文件中,要用extern声明

int main() 
{
    for (int i = 0; environ[i] != NULL; i++) 
    {
        printf("%s\n", environ[i]);
    }
    return 0;
}

2.系统调用

cpp 复制代码
#include <stdio.h>
int main()
{
    printf("%s\n",getenv("PATH"));
    return 0;
}
相关推荐
广州灵眸科技有限公司5 小时前
xfce桌面触摸校准:基于灵眸科技EASY-EAl-Orin-Nano
数据库·windows·科技
大耳朵-小飞象7 小时前
电力安全运维的智能密码:BACS如何破解设备全生命周期管理难题,让电网安全“看得见、管得住”?
运维·安全·智慧城市·能耗系统·楼宇智控·未来生活
极客侃科技7 小时前
制造企业 MES/APS 选型:SAP PP/DS 集成、ERP-MES 边界划分与一体化架构要点
运维·架构·制造
HLC++8 小时前
Linux的进程间通信
android·linux·服务器
华清远见IT开放实验室9 小时前
实验室建设案例 | 石家庄科技信息职业学院嵌入式实验室——从底层硬件到系统应用,一所应用型高校的嵌入式人才培养这样落地
linux·arm开发·stm32·嵌入式硬件·高校·实验室建设
生活爱好者!10 小时前
我把NAS当作下载机,docker一键部署qb
运维·docker·容器
王维同学11 小时前
[原创][Windows C++]LSA 认证、安全与通知包的注册表枚举
c++·windows·安全
YCOSA202512 小时前
雨晨 Windows 11 IOT 企业版 LTSC 24H2 轻装 2合1 26100.8968
windows·物联网
groundhappy12 小时前
idalib安装和codex ida-mcp配置
linux·开发语言·python
尽兴-12 小时前
企业业务系统架构选型与渐进式演进
运维·系统架构·devops