当前位置: 首页 > 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…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...