文章目录
- 前言
- 一、环境变量概念
- 1.1 为什么需要环境变量?
- 1.2 环境变量的本质特征
- 二、环境变量PATH
- 2.1 PATH的运作机制
- 2.2 常见环境变量及其作用
- 2.3 环境变量操作指南
- 三、再谈环境变量
- 3.1main函数命令行参数解析
- 3.2 环境变量的继承机制
- 3.3 本地变量与内部构建命令
- 总结
前言
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。其在计算机中的结构形式一般是name + value(kv)
。
在Windows中,我们有时候在安装某种软件时也需要更改环境变量:
一、环境变量概念
1.1 为什么需要环境变量?
想象这样一个场景:你在寄快递时不需要每次都手动填写快递公司的地址,因为整个城市已经建立了完善的物流网络。环境变量在计算机系统中扮演着类似的角色——为程序运行提供标准化路径指引。
当我们编译C/C++程序时,从来不知道所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器找到标准库的位置。
1.2 环境变量的本质特征
特性 | 说明 |
---|---|
全局性 | 对当前用户的所有进程生效 |
持久性 | 可通过配置文件永久保存 |
继承性 | 子进程自动继承父进程环境变量 |
动态性 | 运行时可以即时修改 |
二、环境变量PATH
2.1 PATH的运作机制
系统中,针对于指令的搜索,Linux系统会提供一个搜索指令的环境变量(PATH)。当我们在终端输入命令时,系统会按照PATH指定的路径顺序查找可执行文件。
echo $PATH //查看环境变量中的内容
# 查看当前PATH设置
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
其中,多个路径按冒号:
分隔,在Linux执行指令时,会依次在路径中搜索某条指令。
例如ls
指令,在系统搜索到 usr/bin 路径时,就找到了ls
指令,遂执行。
- /usr/local/sbin/ls ❌
- /usr/local/bin/ls ❌
- /usr/sbin/ls ❌
- /usr/bin/ls ✅
而code可执行文件并不在当前系统默认指令搜索路径PATH中,因此无法执行。
我们可以使用以下语句,将自己的可执行文件执行路径添加到PATH中,这样就可以像使用ls指令一样使用可执行文件命令了。
export PATH=$PATH:[可执行文件路径]
2.2 常见环境变量及其作用
项目 | 用途说明 | 示例值 |
---|---|---|
PATH | 可执行文件搜索路径 | /usr/bin:/bin |
HOME | 当前用户主目录 | /home/user |
SHELL | 默认Shell程序路径 | /bin/bash |
USER | 当前登录用户名 | alice |
2.3 环境变量操作指南
$ env //查看所有环境变量
$ echo $HOME //查看单个变量
除此之外,我们也可以通过c语言程序获取当前环境变量信息,需要用到系统调用函数getenv()
。
#include <stdio.h>
#include <stdlib.h>
int main()
{
//获取PATH环境变量
printf("PATH = %s\n",getenv("PATH"));
printf("who = %s\n",getenv("USER"));
return 0;
}
在USER环境变量中,随着我们切换用户(切到root),USER的值也随着发生变化,这表明了环境变量具备了识别用户的能力。
自定义环境变量:
# 临时设置
$ export MY_VAR="hello"
# 永久设置(用户级)
$ echo 'export MY_VAR="hello"' >> ~/.bashrc
# 永久设置(系统级)
$ sudo sh -c 'echo "MY_VAR=hello" >> /etc/environment'
#取消环境变量
$ unset MY_VALUE
三、再谈环境变量
3.1main函数命令行参数解析
命令行参数是用户在命令行中输入命令时,所附带的额外信息。它们可以提供给命令的不同选项、标志或参数值,以改变命令的行为或输出。
用来完成指令的解析工作,使命令具有不同的功能。
main函数的三个参数:参数个数、一张命令行参数表、一张环境变量表
int main(int argc, char *argv[], char *env[]) {
// argc: 参数个数
// argv: 命令行参数数组
// env: 环境变量数组
}
命令行参数表:根据不同命令行输入执行不同的内容;
环境变量表:当前的环境变量信息,其内容与env
一致
3.2 环境变量的继承机制
我们执行可执行文件main时,系统会先传入两张向量表,代表了需要执行的操作与继承父进程的环境变量信息!
我们所运行的进程都是子进程,bash启动的时候,会从操作系统的配置文件中读取环境变量信息。而子进程会继承父进程的所有环境变量(向量表方式),换句话来说,bash命令下的所有子进程的环境变量信息一致,因此环境变量具有全局属性。
+----------------+
| 登录Shell |
| PATH=/usr/bin |
+----------------+
|
| fork()
v
+----------------+
| 用户进程 | (继承PATH)
| PATH=/usr/bin |
+----------------+
|
| execve()
v
+----------------+
| 新程序 | (可修改自己的环境变量)
| PATH=/custom |
+----------------+
3.3 本地变量与内部构建命令
类型 | 作用域 | 生命周期 | 子进程可见性 |
---|---|---|---|
环境变量 | 全局 | 会话持续 | 可见 |
本地变量 | 当前Shell | 会话持续 | 不可见 |
本地变量
所谓本地变量,就是可以直接在命令行定义的变量,显然这样创建的变量并不在环境变量中。本地变量只会在本bash内有效,而不会被子进程集成。
使用set
指令用来查看当前系统中的所有本地变量和环境变量。
为何子进程无法继承本地变量,echo同样也会创建子进程继承环境变量,为何与程序不同的是echo可以访问到本地变量MY_VALUE呢?
内部构建命令:
常规命令通过创建子进程完成,内建命令是Shell解释器的原生组成部分,它们不需要创建子进程,而是直接由Shell自身执行,类似与bash调用了自己写的或是系统提供的函数。以上说明,echo是由bash亲自执行的,同样的情况还有cd指令。
总结
掌握环境变量的正确使用方式,将显著提升开发效率和系统管理能力。建议读者通过man environ
命令深入学习相关机制,并在实践中不断探索环境变量的高级用法。
👍 感谢各位大佬观看。如果本文有帮助,请点赞收藏支持~