当前位置: 首页 > news >正文

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

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

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


       在 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 系统的运行机制啦!在开发、运维等工作中,也能更精准地配置和管理进程环境,让系统发挥出最大的潜力哦!加油吧!💪

 

相关文章:

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

&#x1f31f; 快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。&#x1f31f; &#x1f6a9;用通俗易懂且不失专业性的文字&#xff0c;讲解计算机领域那些看似枯燥的知识点&#x1f6a9; 在 Linux 系统里…...

Linux探秘坊-------5.git

1.git介绍 1.版本控制器 为了能够更⽅便我们管理这些不同版本的⽂件&#xff0c;便有了版本控制器。所谓的版本控制器&#xff0c;就是能让你了解到⼀个⽂件的历史&#xff0c;以及它的发展过程的系统。通俗的讲就是⼀个可以记录⼯程的每⼀次改动和版本迭代的⼀个管理系统&am…...

Linux中的几个基本指令(二)

文章目录 1、cp指令例一&#xff1a;例二&#xff1a;例三&#xff1a;例四&#xff1a;例五&#xff1a; 2、mv 指令例一&#xff1a;例二&#xff1a; 3、cat指令例一&#xff1a; 4、tac指令5、which指令6、date指令时间戳&#xff1a;7、zip指令 今天我们继续学习Linux下的…...

Java入门笔记(1)

引言 在计算机编程的广袤宇宙中&#xff0c;Java无疑是一颗格外耀眼的恒星。那么&#xff0c;Java究竟是什么呢&#xff1f; Java是美国Sun公司&#xff08;Stanford University Network&#xff09;在1995年推出的一门计算机高级编程语言。曾经辉煌的Sun公司在2009年被Oracle&…...

设计模式的艺术-开闭原则

原则使用频率图&#xff08;仅供参考&#xff09; 1.如何理解开闭原则 简单来说&#xff0c;开闭原则指的是 “对扩展开放&#xff0c;对修改关闭”。 当软件系统需要增加新的功能时&#xff0c;应该通过扩展现有代码的方式来实现&#xff0c;而不是去修改已有的代码。 例如我…...

【C语言系列】深入理解指针(3)

深入理解指针&#xff08;3&#xff09; 一、字符指针变量二、数组指针变量2.1数组指针变量是什么&#xff1f;2.2数组指针变量怎么初始化&#xff1f; 三、二维数组传参的本质四、函数指针变量4.1函数指针变量的创建4.2函数指针变量的使用4.3两段有趣的代码4.4 typedef关键字 …...

three.js+WebGL踩坑经验合集:写在前面的话

笔者从2023年初开始参与一个基于three.js引擎的web项目的开发工作。本打算2024年春节就把期间踩过的坑写到博客上分享给大家&#xff0c;然而哪怕本专栏的各种构思和内容已经在笔者的脑海里翻滚了一年&#xff0c;得了严重拖延症患者的我还是一直拖到了现在&#xff0c;实在惭愧…...

利用Linux的工作队列(Workqueue)实现中断下半部的处理

本文代码在哪个基础上修改而成&#xff1f; 本文是在博文 https://blog.csdn.net/wenhao_ir/article/details/145228617 的代码基础上修改而成。 关于工作队列(Workqueue)的概念 工作队列(Workqueue)可以用于实现Linux的中断下半部的&#xff0c;之前在博文 https://blog.cs…...

LabVIEW处理复杂系统和数据处理

LabVIEW 是一个图形化编程平台&#xff0c;广泛应用于自动化控制、数据采集、信号处理、仪器控制等复杂系统的开发。它的图形化界面使得开发人员能够直观地设计系统和算法&#xff0c;尤其适合处理需要实时数据分析、高精度控制和复杂硬件集成的应用场景。LabVIEW 提供丰富的库…...

spring-springboot -springcloud

目录 spring: 动态代理: spring的生命周期(bean的生命周期): SpringMvc的生命周期: SpringBoot: 自动装配: 自动装配流程: Spring中常用的注解&#xff1a; Spring Boot中常用的注解&#xff1a; SpringCloud: 1. 注册中心: 2. gateway(网关): 3. Ribbon(负载均…...

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

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

打造本地音乐库

文章目录 存储介质硬盘&#xff08;NAS&#xff09;媒体播放器&#xff08;可视MP3、MP4&#xff09;实体介质&#xff08;CD光盘、黑胶片&#xff09;注意事项为什么不使用在线音乐&#xff08;App&#xff09;和网盘打造一套HiFi系统的成本非常高 获取音乐正版音乐途径免费音…...

【2024 - 年终总结】叶子增长,期待花开

写在前面&#xff1a;本博客仅作记录学习之用&#xff0c;部分图片来自网络&#xff0c;如需引用请注明出处&#xff0c;同时如有侵犯您的权益&#xff0c;请联系删除&#xff01; 文章目录 前言论博客创作保持2024的记录清单博客科研开源工作生活 总结与展望互动致谢参考 前言…...

python 统计相同像素值个数

目录 python 统计相同像素值个数 最大值附近的值 python 统计相同像素值个数 import cv2 import numpy as np import time from collections import Counter# 读取图像 image cv2.imread(mask16.jpg)# 将图像转换为灰度图像 gray_image cv2.cvtColor(image, cv2.COLOR_BGR2…...

蓝卓“1+2+N”智慧工厂架构,让工业智能更简单

面对复杂的工业环境、海量的数据以及多样化的业务需求&#xff0c;如何实现智能化转型&#xff0c;让工业智能触手可及&#xff0c;成为了众多企业面临的难题。蓝卓以创新精神为引领&#xff0c;推出了“12N”智慧工厂架构&#xff0c;旨在简化工业智能的实现路径&#xff0c;让…...

12、MySQL锁相关知识

目录 1、全局锁和表锁使用场景 2、行锁的意义 3、为什么说间隙锁解决了快照的幻读? 4、RR隔离级别产生幻读的场景 5、详解元数据锁(MDL)作用以及如何减少元数据锁 6、出现死锁场景 7、查看MySQL锁情况 8、自增锁 1、全局锁和表锁使用场景 全局锁 备份数据库:当需要…...

某大厂一面:HashMap 的put方法具体做了哪些操作

HashMap 的 put 方法是一个常用的操作&#xff0c;它将一个键值对插入到哈希表中。下面是 put 方法执行的详细流程&#xff0c;包括各个步骤的解释&#xff0c;并附上相应的代码片段。 1. 检查键是否为 null 如果传入的键为 null&#xff0c;HashMap 会特别处理这种情况&…...

WPF基础 | 深入 WPF 事件机制:路由事件与自定义事件处理

WPF基础 | 深入 WPF 事件机制&#xff1a;路由事件与自定义事件处理 一、前言二、WPF 事件基础概念2.1 事件的定义与本质2.2 常见的 WPF 事件类型 三、路由事件3.1 路由事件的概念与原理3.2 路由事件的三个阶段3.3 路由事件的标识与注册3.4 常见的路由事件示例 四、自定义事件处…...

精选100+套HTML可视化大屏模板源码素材

大屏数据可视化以大屏为主要展示载体的数据可视化设计。 “大面积、炫酷动效、丰富色彩”&#xff0c;大屏易在观感上给人留下震撼印象&#xff0c;便于营造某些独特氛围、打造仪式感。 原本看不见的数据可视化后&#xff0c;便能调动人的情绪、引发人的共鸣。 使用方法&…...

如何使用Python爬虫按关键字搜索AliExpress商品:代码示例与实践指南

在电商领域&#xff0c;能够按关键字搜索并获取商品信息对于市场分析、选品和竞品研究至关重要。AliExpress&#xff08;速卖通&#xff09;作为全球知名的跨境电商平台&#xff0c;提供了丰富的商品数据。以下将详细介绍如何使用Python爬虫按关键字搜索AliExpress商品&#xf…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...