Linux 进程环境变量:深入理解与实践指南
🌟 快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。🌟
🚩用通俗易懂且不失专业性的文字,讲解计算机领域那些看似枯燥的知识点🚩
在 Linux 系统里,进程环境变量起着举足轻重的作用✨,为进程提供运行所需的关键信息与配置参数。接下来,让我们深入探索 Linux 进程环境变量的相关知识。
目录
💯常见关键环境变量解析
(一)PATH:程序查找路径的 “导航仪” 🗺️
(二)HOME:用户的专属 “根据地” 🏠
(三)SHELL:人机交互的 “翻译官” 👨💻
💯多维度查看环境变量方法
(一)命令行便捷查看
(二)系统调用接口查询
(三)第三方变量间接获取
💯环境变量的深度测试与实践
(一)PATH 变量的深度测试
(二)HOME 变量的特性验证
💯环境变量相关命令的系统梳理
💯环境变量的底层组织架构揭秘
💯编程获取环境变量的核心方法
(一)利用命令行参数中的环境变量表
(二)借助第三方变量 environ 访问
💯环境变量权限与属性的精细解读
(一)权限判断机制
(二)全局属性剖析
(三)本地变量与环境变量对比
(四)常规命令与内建命令差异
💯常见关键环境变量解析
我们先来见一下widows里的环境变量:
(一)PATH:程序查找路径的 “导航仪” 🗺️
当我们在终端输入指令时,有些指令能马上执行,可自己编译的程序却常常要加 ./
才行,这是为啥呢?🧐
原来是 PATH 环境变量在起作用!它就像是系统搜索指令程序的 “寻宝地图”🧐,通过
echo $PATH
查看,会发现它是由好多用:
隔开的目录路径组成的。像
/usr/local/bin
、/usr/bin
这些常见路径都在里面哦。
为啥系统预装的 ls
、pwd
等命令能直接用呢?
就是因为它们所在的路径已经在 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 路径扩展策略:那怎么让我们自己写的程序也能像系统指令一样方便地执行呢?有两个办法哦!
- 一是把程序复制到 PATH 里的某个目录,比如
/usr/local/bin
,不过这通常需要管理员权限,而且得小心点,别把系统搞乱啦🚫!- 二是用
export PATH=$PATH:程序所在路径
这个命令把程序所在目录临时加到 PATH 里。要是程序在当前目录,就执行export PATH=$PATH:.
,这样在同一个终端会话里就能直接执行这个程序啦,是不是很简单呢?就像给程序找到了一条快速通行的 “绿色通道”🚀!
(二)HOME 变量的特性验证
- 用户目录识别差异测试:分别用 root 用户和普通用户登录系统,然后执行
echo $HOME
命令。root 用户会得到/root
,普通用户就会得到自己对应的主目录,比如/home/username
。这就体现了 HOME 变量很聪明,能根据不同用户身份找到对应的 “家”,确保每个用户都能快速回到自己的专属小天地哦!就像不同的钥匙能打开不同的家门 🔑!- 快捷符号与 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 就直接自己执行啦,不用创建子进程哦。像 echo
、pwd
、cd
这些就是内建命令。就拿 cd
命令来说,它在底层是通过 chdir
函数实现目录切换功能的。这种执行方式的差异就决定了命令的执行效率和资源消耗情况,我们在使用命令和优化系统性能的时候,可一定要注意哦⚠️!
通过对 Linux 进程环境变量这么全面深入的了解,我们就能像个高手一样熟练地掌控 Linux 系统的运行机制啦!在开发、运维等工作中,也能更精准地配置和管理进程环境,让系统发挥出最大的潜力哦!加油吧!💪
相关文章:

Linux 进程环境变量:深入理解与实践指南
🌟 快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。🌟 🚩用通俗易懂且不失专业性的文字,讲解计算机领域那些看似枯燥的知识点🚩 在 Linux 系统里…...

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

Linux中的几个基本指令(二)
文章目录 1、cp指令例一:例二:例三:例四:例五: 2、mv 指令例一:例二: 3、cat指令例一: 4、tac指令5、which指令6、date指令时间戳:7、zip指令 今天我们继续学习Linux下的…...
Java入门笔记(1)
引言 在计算机编程的广袤宇宙中,Java无疑是一颗格外耀眼的恒星。那么,Java究竟是什么呢? Java是美国Sun公司(Stanford University Network)在1995年推出的一门计算机高级编程语言。曾经辉煌的Sun公司在2009年被Oracle&…...

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

【C语言系列】深入理解指针(3)
深入理解指针(3) 一、字符指针变量二、数组指针变量2.1数组指针变量是什么?2.2数组指针变量怎么初始化? 三、二维数组传参的本质四、函数指针变量4.1函数指针变量的创建4.2函数指针变量的使用4.3两段有趣的代码4.4 typedef关键字 …...
three.js+WebGL踩坑经验合集:写在前面的话
笔者从2023年初开始参与一个基于three.js引擎的web项目的开发工作。本打算2024年春节就把期间踩过的坑写到博客上分享给大家,然而哪怕本专栏的各种构思和内容已经在笔者的脑海里翻滚了一年,得了严重拖延症患者的我还是一直拖到了现在,实在惭愧…...

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

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

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

DRG/DIP 2.0时代下基于PostgreSQL的成本管理实践与探索(下)
五、数据处理与 ETL 流程编程实现 5.1 数据抽取与转换(ETL) 在 DRG/DIP 2.0 时代的医院成本管理中,数据抽取与转换(ETL)是将医院各个业务系统中的原始数据转化为可供成本管理分析使用的关键环节。这一过程涉及从医院 HIS 系统中抽取患者诊疗数据,并对其进行格式转换、字…...
打造本地音乐库
文章目录 存储介质硬盘(NAS)媒体播放器(可视MP3、MP4)实体介质(CD光盘、黑胶片)注意事项为什么不使用在线音乐(App)和网盘打造一套HiFi系统的成本非常高 获取音乐正版音乐途径免费音…...

【2024 - 年终总结】叶子增长,期待花开
写在前面:本博客仅作记录学习之用,部分图片来自网络,如需引用请注明出处,同时如有侵犯您的权益,请联系删除! 文章目录 前言论博客创作保持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”智慧工厂架构,让工业智能更简单
面对复杂的工业环境、海量的数据以及多样化的业务需求,如何实现智能化转型,让工业智能触手可及,成为了众多企业面临的难题。蓝卓以创新精神为引领,推出了“12N”智慧工厂架构,旨在简化工业智能的实现路径,让…...
12、MySQL锁相关知识
目录 1、全局锁和表锁使用场景 2、行锁的意义 3、为什么说间隙锁解决了快照的幻读? 4、RR隔离级别产生幻读的场景 5、详解元数据锁(MDL)作用以及如何减少元数据锁 6、出现死锁场景 7、查看MySQL锁情况 8、自增锁 1、全局锁和表锁使用场景 全局锁 备份数据库:当需要…...
某大厂一面:HashMap 的put方法具体做了哪些操作
HashMap 的 put 方法是一个常用的操作,它将一个键值对插入到哈希表中。下面是 put 方法执行的详细流程,包括各个步骤的解释,并附上相应的代码片段。 1. 检查键是否为 null 如果传入的键为 null,HashMap 会特别处理这种情况&…...

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

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

如何使用Python爬虫按关键字搜索AliExpress商品:代码示例与实践指南
在电商领域,能够按关键字搜索并获取商品信息对于市场分析、选品和竞品研究至关重要。AliExpress(速卖通)作为全球知名的跨境电商平台,提供了丰富的商品数据。以下将详细介绍如何使用Python爬虫按关键字搜索AliExpress商品…...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...

React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

【iOS】 Block再学习
iOS Block再学习 文章目录 iOS Block再学习前言Block的三种类型__ NSGlobalBlock____ NSMallocBlock____ NSStackBlock__小结 Block底层分析Block的结构捕获自由变量捕获全局(静态)变量捕获静态变量__block修饰符forwarding指针 Block的copy时机block作为函数返回值将block赋给…...