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

news/2025/1/24 6:03:51/

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

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


       在 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.ppmy.cn/news/1565693.html

相关文章

分词器的词表大小以及如果分词器的词表比模型的词表大,那么模型的嵌入矩阵需要被调整以适应新的词表大小。

分词器的词表大小是怎么来的 分词器的词表大小是由分词器在训练过程中使用的数据集决定的。具体来说&#xff0c;分词器会根据输入的文本数据集进行分词&#xff0c;然后构建一个词汇表。这个词汇表包含了所有分词器能够识别和处理的词语或子词的集合。词表大小就是这个集合中…

docker安装elk6.7.1-搜集java日志

docker安装elk6.7.1-搜集java日志 如果对运维课程感兴趣&#xff0c;可以在b站上、A站或csdn上搜索我的账号&#xff1a; 运维实战课程&#xff0c;可以关注我&#xff0c;学习更多免费的运维实战技术视频 0.规划 192.168.171.130 tomcat日志filebeat 192.168.171.131 …

【算法】经典博弈论问题——巴什博弈 python

目录 前言巴什博弈(Bash Game)小试牛刀PN分析实战检验总结 前言 博弈类问题大致分为&#xff1a; 公平组合游戏、非公平组合游戏&#xff08;绝大多数的棋类游戏&#xff09;和 反常游戏 巴什博弈(Bash Game) 一共有n颗石子&#xff0c;两个人轮流拿&#xff0c;每次可以拿1~m颗…

Linux文件的特殊权限SUID、SGID、Sticky

文章目录 前言1. SUID&#xff08;Set User ID&#xff09;**1. 描述与定义****2. 格式****3. 设置与取消****4. 案例****5. 说明****6. 注意事项** 2. SGID&#xff08;Set Group ID&#xff09;**1. 描述与定义****2. 格式****3. 设置与取消****4. 案例****对文件的作用****对…

Kafka-常见的问题解答

讲一讲分布式消息中间件 问题 什么是分布式消息中间件&#xff1f;消息中间件的作用是什么&#xff1f;消息中间件的使用场景是什么&#xff1f;消息中间件选型&#xff1f; 分布式消息是一种通信机制&#xff0c;和 RPC、HTTP、RMI 等不一样&#xff0c;消息中间件采用分布式…

窥探QCC518x-308x系列与手机之间的蓝牙HCI记录与分析 - 耳机篇

上一篇是介绍如何窥探手机端Bluetooth的HCI log, 本次介绍是如何窥探Bluetooth的HCI log-耳机篇. 这次跟QCC518x/QCC308x测试的手机是Samsung S23 Ultra. QCC518x/QCC308x透过HCI界面取得Log教学. 步骤1: 开启QMDE -> 选择ADK r1102 QCC3083 Headset workspace.步骤2: 点…

SD换脸插件Reactor的安装教程

SD中最好用的换脸插件非Reactor莫属。软件虽好用&#xff0c;但安装很麻烦。今天主要讲Reactor插件的安装。 使用教程看这里&#xff1a;&#xff08;B站&#xff09;https://www.bilibili.com/video/BV1pj421f7iz/?spm_id_from333.999.0.0&vd_source2ed99a70e006bb11db9…

UnicodeEncodeError 通常是因为在某些环境中,系统的 locale 设置不支持 Unicode 字符(如中文字符)

now.strftime("%Y年%m月%d日") ^^^^^^^^^^^^^^^^^^^^^^^^^ UnicodeEncodeError: locale codec cant encode character \u5e74 方法1 设置 Python 的 locale import locale from datetime import datetime# 设置 locale 为中文&#xff08;简体…