Linux 进程环境变量:深入理解与实践指南

news2025/1/24 12:16:02

  🌟 快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。🌟   

🚩用通俗易懂且不失专业性的文字,讲解计算机领域那些看似枯燥的知识点🚩  


       在 Linux 系统里,进程环境变量起着举足轻重的作用✨,为进程提供运行所需的关键信息与配置参数。接下来,让我们深入探索 Linux 进程环境变量的相关知识。


目录

💯常见关键环境变量解析

(一)PATH:程序查找路径的 “导航仪” 🗺️

(二)HOME:用户的专属 “根据地” 🏠

(三)SHELL:人机交互的 “翻译官” 👨‍💻

💯多维度查看环境变量方法

(一)命令行便捷查看

(二)系统调用接口查询

(三)第三方变量间接获取

💯环境变量的深度测试与实践

(一)PATH 变量的深度测试

(二)HOME 变量的特性验证

💯环境变量相关命令的系统梳理

💯环境变量的底层组织架构揭秘

💯编程获取环境变量的核心方法

(一)利用命令行参数中的环境变量表

(二)借助第三方变量 environ 访问

💯环境变量权限与属性的精细解读

(一)权限判断机制

(二)全局属性剖析

(三)本地变量与环境变量对比

(四)常规命令与内建命令差异


💯常见关键环境变量解析

 我们先来见一下widows里的环境变量:

(一)PATH:程序查找路径的 “导航仪” 🗺️

        当我们在终端输入指令时,有些指令能马上执行,可自己编译的程序却常常要加 ./ 才行,这是为啥呢?🧐

        原来是 PATH 环境变量在起作用!它就像是系统搜索指令程序的 “寻宝地图”🧐,通过 echo $PATH 查看,会发现它是由好多用 : 隔开的目录路径组成的。

        像 /usr/local/bin/usr/bin 这些常见路径都在里面哦。

        为啥系统预装的 lspwd 等命令能直接用呢?

        就是因为它们所在的路径已经在 PATH 里啦!而我们自己编译的程序默认在当前工作目录,这个目录不在 PATH 里,系统就找不到,所以得用 ./ 来告诉它具体位置。

如果想不用  ./  就执行,我们可以在PATH里面添加指定路径 

(如果不小心将PATH路径改错,重新登录Xshell即可) 

(二)HOME:用户的专属 “根据地” 🏠

        用 echo $HOME 看到的路径,就是我们登录系统后默认进入的主工作目录哦。普通用户一般是 /home/username,root 用户就是 /root 啦。这个目录就像是我们在系统里的 “家”,我们可以在里面自由地创建文件、文件夹,想怎么折腾就怎么折腾呢!

 

(三)SHELL:人机交互的 “翻译官” 👨‍💻

  echo $SHELL 显示的是当前用的 Shell 程序路径,通常是 /bin/bash。Shell 就像一个 “翻译官”,把我们输入的命令翻译成系统能懂的语言,然后传给内核去执行。它的语法和功能可重要啦,直接影响我们操作电脑的体验哦!


💯多维度查看环境变量方法

(一)命令行便捷查看

  • env (environment)命令:在终端输入 env,系统就会像变魔术一样把所有环境变量和它们的值都展示出来,就像打开了一个装满宝藏信息的宝箱 🎁,里面有系统配置、用户设置等各种各样的信息,让我们能对系统运行环境有个全面的了解。
  • echo 命令:用 echo $NAME(这里的 NAME 是具体的环境变量名哦)就能快速查看单个环境变量的值啦。比如 echo $PATH 就能马上知道程序搜索路径的情况,是不是很方便呢?就像一个快速查询小助手 🔍!

(二)系统调用接口查询

在 C 语言程序里,先 #include <stdlib.h> 把头文件引进来,然后就能用 getenv 函数获取环境变量值啦。看下面这个例子:

#include <stdio.h>
#include <stdlib.h>

int main() {
    char *path = getenv("PATH");
    if (path) {
        printf("PATH: %s\n", path);
    } else {
        printf("PATH environment variable not found.\n");
    }
    return 0;
}

这种方法在编程的时候可有用啦,能让程序根据环境变量灵活地调整自己的行为,是不是很厉害呢?就像给程序赋予了智能感知环境的超能力💡!

(三)第三方变量间接获取

通过 extern char **environ,在程序里就能访问环境变量表啦。像这样:

#include <stdio.h>

int main() {
    extern char **environ;
    int i = 0;
    for (; environ[i]; i++) {
        printf("%d: %s\n", i, environ[i]);
    }
    return 0;
}

        虽然 environ 不在常见头文件里定义,但用这种方法,开发者就能深入底层,拿到完整的环境变量列表,就像找到了系统的 “隐藏秘籍”📖,对程序开发和系统调试可有很大帮助哦!


💯环境变量的深度测试与实践

 

(一)PATH 变量的深度测试

1.程序执行路径探索实验:咱们先来创建一个简单的 C 语言 hello.c 文件,代码如下:

#include <stdio.h>
int main() {
    printf("hello world!\n");
    return 0;
}

        用 gcc -o hello hello.c 编译好后,在当前目录下执行 ./hello 能正常输出结果,可直接输入 hello 就会提示 command not found。这就清楚地展示了系统对 PATH 路径的依赖啦,只有在 PATH 里的程序才能被直接叫出来哦!就像在学校里,只有在花名册上的同学老师才能一下子叫出名字呢📋!


2. PATH 路径扩展策略:那怎么让我们自己写的程序也能像系统指令一样方便地执行呢?有两个办法哦!

  1. 一是把程序复制到 PATH 里的某个目录,比如 /usr/local/bin,不过这通常需要管理员权限,而且得小心点,别把系统搞乱啦🚫!
  2. 二是用 export PATH=$PATH:程序所在路径 这个命令把程序所在目录临时加到 PATH 里。要是程序在当前目录,就执行 export PATH=$PATH:.,这样在同一个终端会话里就能直接执行这个程序啦,是不是很简单呢?就像给程序找到了一条快速通行的 “绿色通道”🚀!

(二)HOME 变量的特性验证

  1. 用户目录识别差异测试:分别用 root 用户和普通用户登录系统,然后执行 echo $HOME 命令。root 用户会得到 /root,普通用户就会得到自己对应的主目录,比如 /home/username。这就体现了 HOME 变量很聪明,能根据不同用户身份找到对应的 “家”,确保每个用户都能快速回到自己的专属小天地哦!就像不同的钥匙能打开不同的家门 🔑!
  2. 快捷符号与 HOME 关联实验:在终端执行 cd ~ 命令后再执行 pwd,你会发现显示的路径和 echo $HOME 是一样的哦!这就说明在 Linux 里,~ 就是 HOME 变量的快捷方式,就像给 HOME 变量取了个小名,用 ~ 就能快速回到 “家”,是不是很方便呢?就像有了一个瞬间移动的小魔法✨!

💯环境变量相关命令的系统梳理

  • export:这个命令可以用来创建新的环境变量,或者把本地变量变成环境变量哦。比如 export MYENV="hello world" 就能定义一个叫 MYENV 的环境变量,它在当前和后面的子进程里都能生效呢!就像给系统环境开了个新的 “小窗口”🪟,可以往里面放我们需要的信息哦!
  • unset:执行 unset MYENV 就能把指定的环境变量删掉啦。要是有些环境变量我们不再需要了,就可以用这个命令清理掉,让系统环境保持整洁干净,就像打扫房间一样哦🧹!
  • set:这个命令可厉害啦,它不仅能显示环境变量,还会把本地定义的 shell 变量也列出来,就像一个万能的清单📜,让我们能全面了解当前 shell 环境里的变量情况,方便我们管理和调试环境变量哦!

💯环境变量的底层组织架构揭秘

        在 Linux 系统的底层,每个程序运行的时候都会收到一张环境表,它其实就是一个字符指针数组哦。数组里的每个指针都指向一个以 '\0' 结尾的环境字符串,这些字符串就像一个个小标签🏷️,用 name=value 的形式存着环境变量信息。比如说 environ[0] 可能就指向 "HOME=/home/akaedu\0",这种组织方式就像一个超级有序的文件柜📄,让系统能高效地管理和传递环境变量数据哦!


💯编程获取环境变量的核心方法

(一)利用命令行参数中的环境变量表


main函数中有俩个参数,我们将其打印出来看看:

把命令打散,给argv[]

 为什么要打散呢?

我们来看下面的代码

 

这就是为什么我们之前的指令可以带不同的选项


 

        在 C 语言的 main 函数里,有个参数 char *env[] 就是环境变量表哦。用下面这样的代码遍历这个数组,就能拿到所有环境变量信息啦:

#include <stdio.h>
#include <stdlib.h>

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

        这种方法在程序启动的时候就能让开发者直接访问环境变量,就像给程序一把打开环境变量宝库的钥匙 🔑,让程序能根据环境变量进行初始化和配置哦!

结论: 

         我们所运行的进程,都是子进程,bash本身在启动的时候,会从操作系统的配置文件中读取环境变量的信息,子进程会继承父进程交给我的环境变量!

(二)借助第三方变量 environ 访问

        就像前面说的,通过 extern char **environ 声明后,在程序里遍历 environ 数组就能获取环境变量啦。这是一种基于系统底层机制的方法,在一些特殊情况下,比如要对环境变量进行深度处理,或者和系统底层打交道的时候,就特别有用啦,就像一个隐藏的小技巧哦🎯!


💯环境变量权限与属性的精细解读

(一)权限判断机制

        在程序里,可以用 getenv 函数拿到 USER 环境变量的值,然后用 strcmp 函数和 "root" 比较,就能知道当前用户是不是超级用户啦。看下面这个例子:

 

#include <stdio.h>
#include <stdlib.h>

int main() {
    char who[32];
    strcpy(who, getenv("USER"));
    if (strcmp(who, "root") == 0) {
        printf("拥有超级权限,可执行特权操作\n");
    } else {
        printf("普通用户,受权限限制\n");
    }
    return 0;
}

        这个机制能让程序根据用户权限灵活地调整自己的功能和行为,就像一个智能的小卫士🛡️,保证系统的安全和稳定哦!

(二)全局属性剖析

        环境变量的全局属性是因为在进程创建的时候有继承机制哦。当 bash 启动的时候,会从操作系统配置文件里读取环境变量,然后后面创建的子进程就会继承父进程的环境变量表,就像家族传承一样,一代传一代呢👨‍👩‍👧‍👦!比如说,在父进程里修改了环境变量,子进程就会继承新的值;但是在子进程里修改环境变量,不会影响父进程哦,这是因为有写时拷贝技术,它就像一个保护罩🛡️,保证了进程间环境变量的独立性和一致性哦!

(三)本地变量与环境变量对比

 

        本地变量只在 bash 内部有效,不会被子进程继承哦。比如说命令行提示符的显示设置(root 用户是 #,普通用户是 $)就是本地变量的一个例子。用 set 命令可以查看本地变量和环境变量用 export 能把本地变量变成环境变量unset 则可以清除变量,这些命令就像一套魔法工具🧙‍♂️,让我们能在不同类型的变量之间自由转换和管理哦!

 

(四)常规命令与内建命令差异

        常规命令在执行的时候,bash 会创建子进程来完成任务;而内建命令呢,bash 就直接自己执行啦,不用创建子进程哦。像 echopwdcd 这些就是内建命令。就拿 cd 命令来说,它在底层是通过 chdir 函数实现目录切换功能的。这种执行方式的差异就决定了命令的执行效率和资源消耗情况,我们在使用命令和优化系统性能的时候,可一定要注意哦⚠️!


        通过对 Linux 进程环境变量这么全面深入的了解,我们就能像个高手一样熟练地掌控 Linux 系统的运行机制啦!在开发、运维等工作中,也能更精准地配置和管理进程环境,让系统发挥出最大的潜力哦!加油吧!💪

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2281418.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【博客之星】2024年度总结

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;CSDN博客专家   &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01…

Linux下php8安装phpredis扩展的方法

Linux下php8安装phpredis扩展的方法 下载redis扩展执行安装编辑php.ini文件重启php-fpmphpinfo 查看 下载redis扩展 前提是已经安装好redis服务了 php-redis下载地址 https://github.com/phpredis/phpredis 执行命令 git clone https://github.com/phpredis/phpredis.git执行…

训练大模型所需要的内存计算

计算训练一个7B参数大模型所需的显存&#xff0c;主要涉及以下几个方面&#xff1a; 1. 模型参数 每个参数通常需要4字节&#xff08;32位浮点数&#xff09;&#xff0c;因此7B参数的显存需求为&#xff1a; 2. 优化器状态 常见的优化器如Adam&#xff0c;每个参数需要存…

笋瓜果实的代谢组学和转录组分析-文献精读103

Metabolomics and Transcription Profiling of Pumpkin Fruit Reveals Enhanced Bioactive Flavonoids and Coumarins in Giant Pumpkin (Cucurbita maxima) 笋瓜果实的代谢组学和转录组分析揭示了笋瓜&#xff08;Cucurbita maxima&#xff09;中生物活性黄酮和香豆素的增强 …

Jenkins下载 Maven、Allure 插件并且配置环境

文章目录 Jenkins在插件中心下载 maven、allure插件maven插件下载allure插件下载 配置maven、allure 往期推荐&#xff1a; 最新! 在 Linux上搭建Jenkins环境! Jenkins邮件通知的详细配置含邮件通知模板&#xff01; Jenkin配置企业微信通知 Jenkins在插件中心下载 maven、…

【深度学习】微积分

微积分 在2500年前&#xff0c;古希腊人把一个多边形分成三角形&#xff0c;并把它们的面积相加&#xff0c;才找到计算多边形面积的方法。 为了求出曲线形状&#xff08;比如圆&#xff09;的面积&#xff0c;古希腊人在这样的形状上刻内接多边形。 如图2.4.1所示&#xff0c…

宝塔Linux+docker部署nginx出现403 Forbidden

本文主要讲述了宝塔docker部署nginx出现403 Forbidden的原因&#xff0c;以及成功部署前端的方法步骤。 目录 1、问题描述2、问题检测2.1 检测监听端口是否异常2.2 检测Docker容器是否异常2.2.1 打开宝塔Linux的软件商店&#xff0c;找到Docker管理器&#xff0c;查看前端容器是…

Tensor 基本操作2 理解 tensor.max 操作,沿着给定的 dim 是什么意思 | PyTorch 深度学习实战

前一篇文章&#xff0c;Tensor 基本操作1 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 目录 Tensor 基本操作torch.max默认指定维度 Tensor 基本操作 torch.max torch.max 实现降维运算&#xff0c;基于指定的 d…

[Linux] 进程管理与调度机制

文章目录 一.进程前言1.冯诺依曼体系结构2.操作系统 二.进程相关概念1.PCB2.查看进程标识符3.父与子进程 三.进程状态1.状态类别1).运行2).阻塞3).挂起 2.Linux下的状态1).R(running)2).S(Sleeping)3).D(disk sleeping)4).T(stopped)5).t(tracing stopped)6).Z(僵尸进程)7).孤儿…

复位信号的同步与释放(同步复位、异步复位、异步复位同步释放)

文章目录 背景前言一、复位信号的同步与释放1.1 同步复位1.1.1 综述1.1.2 优缺点 1.2 recovery time和removal time1.3 异步复位1.3.1 综述1.3.2 优缺点 1.4 同步复位 与 异步复位1.5 异步复位、同步释放1.5.1 总述1.5.2 机理1.5.3 复位网络 二、思考与补充2.1 复…

Unity中关于实现 管道水流+瀑布流动+大肠蠕动效果笔记

Unity中关于实现 管道水流瀑布流动大肠蠕动效果笔记 效果展示&#xff1a; 参考资料及链接&#xff1a; 1、如何在 Unity 中创建水效果 - 水弯曲教程 https://www.youtube.com/watch?v3CcWus6d_B8 关于补充个人技能中&#xff1a;顶点噪波影响网格着色器配合粒子实现水特效 …

Cloudpods是一个开源的Golang实现的云原生的融合多云/混合云的云平台,也就是一个“云上之云”。

Cloudpods是一个开源的Golang实现的云原生的融合多云/混合云的云平台&#xff0c;也就是一个“云上之云”。Cloudpods不仅可以管理本地的虚拟机和物理机资源&#xff0c;还可以管理多个云平台和云账号。Cloudpods隐藏了这些异构基础设施资源的数据模型和API的差异&#xff0c;对…

【LeetCode】--- MySQL刷题集合

1.组合两个表&#xff08;外连接&#xff09; select p.firstName,p.lastName,a.city,a.state from Person p left join Address a on p.personId a.personId; 以左边表为基准&#xff0c;去连接右边的表。取两表的交集和左表的全集 2.第二高的薪水 &#xff08;子查询、if…

JavaScript学习笔记(3)

一.BOM对象 BOM的全称是Browser Object Model,翻译过来是浏览器对象模型。也就 是JavaScript将浏览器的各个组成部分封装成了对象。我们要操作浏览器的部分功能&#xff0c;可以通过操作 BOM对象的相关属性或者函数来完成。例如&#xff1a;我们想要将浏览器的地址改为 http:/…

DRG/DIP 2.0时代下基于PostgreSQL的成本管理实践与探索(下)

五、数据处理与 ETL 流程编程实现 5.1 数据抽取与转换(ETL) 在 DRG/DIP 2.0 时代的医院成本管理中,数据抽取与转换(ETL)是将医院各个业务系统中的原始数据转化为可供成本管理分析使用的关键环节。这一过程涉及从医院 HIS 系统中抽取患者诊疗数据,并对其进行格式转换、字…

【玩转全栈】----YOLO8训练自己的模型并应用

继上篇&#xff1a; 【玩转全栈】---基于YOLO8的图片、视频目标检测-CSDN博客 相信大家已经可以训练一些图片和视频了&#xff0c;接下来我将为大家介绍如何训练自己的特定模型&#xff0c;并用其进行检测 目录 准备数据 图片数据 标识数据 配置文件 运行 测试训练结果 存在的问…

简洁实用的wordpress外贸模板

简洁、实用、大气的wordpress外贸模板&#xff0c;适合跨境电商搭建外贸B2B产品展示型网站。 简洁实用的wordpress外贸模板 - 简站WordPress主题简洁、实用、大气的wordpress外贸模板&#xff0c;适合跨境电商搭建外贸B2B产品展示型网站。https://www.jianzhanpress.com/?p828…

Caesar

Caesar 打开.txt: oknqdbqmoq{kag_tmhq_xqmdzqp_omqemd_qzodkbfuaz} 根据题目判断是凯撒密码&#xff0c;flag前头是cyberpeace{}&#xff0c;可以得到偏移量是12. 所以&#xff1a; cyberpeace{you_have_learned_caesar_encryption} 下面是我找的关于凯撒密码的解密脚本 c…

OpenEuler学习笔记(四):OpenEuler与CentOS的区别在那里?

OpenEuler与CentOS的对比 一、基本信息 起源与背景&#xff1a; OpenEuler&#xff1a;由华为发起&#xff0c;后捐赠给开放原子开源基金会&#xff0c;旨在构建一个开放、多元化的云计算和边缘计算平台&#xff0c;以满足华为及其他企业的硬件和软件需求。CentOS&#xff1a;…

纯css实现div宽度可调整

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>纯css实现div尺寸可调整</title><style…