资讯动态

【Linux系统】09 环境变量

发布时间:2026/10/15 4:09:52 来源:尧图企业网站定制
前言前面我们学习了进程、PCB、fork、进程状态、进程切换我们知道 fork 创建子进程时子进程会拷贝父进程的 PCB 与相关资源。 在 Linux 中执行ls、pwd、whoami这类命令我们不需要输入完整路径/bin/ls直接敲命令名就可以运行程序这个能力的底层支撑就是环境变量。环境变量是一组以keyvalue形式组织的全局字符串存放在进程的环境表中属于进程上下文的一部分。环境变量的核心特性父进程的环境变量fork 创建子进程时会被子进程继承。环境变量的组织方式每个程序都会收到⼀张环境表环境表是⼀个字符指针数组每个指针指向⼀个以’\0’结尾的环境字符串局部变量不会被子进程继承环境变量可以被子进程继承这是二者最核心区别。一、变量分类本地变量 vs 环境变量1. 本地变量自定义局部变量在当前 bash 终端内定义仅在当前 shell 进程内部生效。fork 创建的子进程无法读取这个变量终端关闭变量直接销毁。# 定义本地变量 local_val我是本地变量 # 查看变量 echo $local_val新开子 shell 测试bash # 创建子shell echo $local_val # 无输出子进程拿不到本地变量 exit # 退出子shell2. 环境变量全局变量环境变量存放在进程的环境表中当父进程 fork 生成子进程子进程会拷贝父进程完整环境表子进程可以读取父进程的环境变量。 使用export可以把本地变量提升为环境变量。# 方式1定义同时导出为环境变量 export env_val我是环境变量 # 方式2先定义本地变量再导出 test_val100 export test_val子 shell 测试bash echo $env_val # 输出 我是环境变量子进程继承成功 exit二、查看环境变量的常用命令1. env直接打印所有环境变量只会输出环境变量不会输出 shell 本地变量。env2. echo $ 变量名查看单个环境变量$符号代表取变量的值echo $PATH echo $HOME echo $USER echo $SHELL echo $PWD3. set输出本地变量 环境变量输出范围比 env 更大。4. export不带参数执行 export列出所有环境变量效果近似 env。5. unset 删除变量无论是本地变量还是环境变量都可以使用 unset 删除。unset env_val三、Linux 系统内置常用环境变量详解表格环境变量作用说明PATH最重要可执行程序搜索路径。直接输入程序名系统按 PATH 内目录顺序查找可执行文件目录之间用冒号:分隔HOME当前登录用户的家目录。不带参数执行cd默认直接回到 $HOMEUSER当前登录的用户名SHELL当前使用的命令解释器一般是/bin/bashPWD当前所在工作目录pwd命令本质就是读取这个环境变量LOGNAME登录用户名和 USER 含义相近LD_LIBRARY_PATH动态库搜索路径程序运行时优先从该目录寻找动态库LANG系统语言字符集控制终端中文 / 英文输出重点深入理解 PATHPATH 的值是多个目录使用:隔开示例PATH/usr/local/bin:/usr/bin:/bin执行ls时操作系统的查找逻辑依次遍历 PATH 里面的目录先去第一个目录/usr/local/bin寻找名为 ls 的可执行文件找到就直接执行停止搜索找不到就继续去下一个目录查找全部目录查找完毕仍然找不到提示command not found。小实验自己写 C 程序编译生成 a.out默认执行必须./a.out。 如果把当前目录加入 PATH就可以直接输入 a.out 运行export PATH$PATH:.$PATH代表保留原来 PATH 所有内容.代表当前目录。 ⚠️ 安全提醒不要长期把.放在 PATH 最前面存在恶意程序安全隐患。四、临时环境变量与永久环境变量4.1 临时修改环境变量使用 export 命令直接在终端修改仅当前 bash 进程以及它 fork 出来的子进程生效关闭终端之后修改全部失效。上面所有 export 示例都是临时修改。4.2 永久修改环境变量修改配置文件每次登录 shell 自动加载配置永久生效。分为用户级别和系统级别。用户级别只对当前登录用户生效推荐使用 配置文件~/.bashrc、~/.bash_profilevim ~/.bashrc # 在文件末尾添加这一行 export MY_ENV永久环境变量测试保存退出文件后执行 source 加载配置不需要重新登录终端source ~/.bashrcsource 原理在当前 shell 进程执行脚本不会创建子 shell。 如果直接执行./.bashrc会新建子 shell 运行脚本环境变量只在子 shell 生效父终端不会生效。系统级别所有登录用户都会生效需要 root 权限 配置文件/etc/profile修改后所有用户登录都会加载这个环境变量。修改系统级配置需要谨慎。五、C 语言代码中获取环境变量环境变量以字符串数组形式保存数组每一项是keyvalue数组最后一项是 NULL 标记结束。 C 语言有三种方式获取环境变量。方式 1main 函数第三个参数 envmain 完整原型int main(int argc, char* argv[], char* env[]);env 就是环境变量字符串数组。#include stdio.h int main(int argc, char* argv[], char* env[]) { //遍历打印全部环境变量 for(int i 0; env[i]; i) { printf(%s\n, env[i]); } return 0; }编译运行输出结果等价于env命令。方式 2库函数 getenv工程推荐写法头文件#include stdlib.h函数原型char *getenv(const char *name);传入环境变量名称字符串返回对应 value 指针环境变量不存在返回 NULL。 优点不需要遍历全部环境变量直接按名字查找代码可读性高。#include stdio.h #include stdlib.h int main() { char* path_val getenv(PATH); if(path_val ! NULL) { printf(PATH %s\n, path_val); } return 0; }方式 3全局外部变量 environ系统提供全局变量environ类型char**代表环境变量数组不需要 main 传参也可以使用。#include stdio.h extern char** environ; int main() { for(int i 0; environ[i]; i) { printf(%s\n, environ[i]); } return 0; }面试考点三种获取方式对比工程开发优先使用 getenv。六、fork 父子进程环境变量继承规则【核心重点】父进程执行 export 设置环境变量之后再 fork 创建子进程子进程会拷贝一份父进程环境表子进程可以继承环境变量。子进程修改自己的环境变量不会影响父进程。fork 采用写时拷贝父子进程地址空间相互独立。子进程创建完成之后父进程后续新增 / 修改环境变量已经存在的子进程不会感知到父进程的变化。本地变量不会被子进程继承只有 export 导出后的环境变量才会被子进程继承。验证实验# 定义本地变量 var_local100 # 导出环境变量 export var_env200 # 创建子shell bash echo $var_local # 无输出本地变量无法继承 echo $var_env # 输出200环境变量继承成功 exit七、source 命令详解面试高频source 脚本名 # 简写 . 点 . 脚本名普通执行脚本./test.sh会创建子 shell 进程执行脚本脚本内部 export 的环境变量只在子 shell 生效脚本执行结束子进程销毁父 shell 完全不受影响。source 执行脚本不会创建新进程直接在当前 shell 进程执行脚本代码。脚本里定义的环境变量直接作用在当前终端。所以修改.bashrc之后要用 source 生效而不是直接运行文件。八、面试高频问答Q1本地变量和环境变量的区别本地变量仅当前 shell 进程可见fork 子进程无法继承环境变量保存在进程环境表fork 子进程会拷贝环境表子进程可以继承环境变量。Q2环境变量什么时候被子进程继承必须是父进程已经 export 导出环境变量然后再 fork 创建子进程子进程才能拿到。子进程创建完成之后父进程新增环境变量子进程看不到。Q3command not found 报错有哪些原因命令 / 可执行文件本身不存在可执行文件存在但是文件所在目录不在 PATH 环境变量的搜索目录中文件存在但是当前用户没有可执行权限。 解决办法使用绝对路径执行或者把目录添加到 PATH。Q4source 和直接执行脚本 ./xxx.sh 的区别./xxx.sh新建子 shell 运行脚本脚本内环境变量只在子进程生效父 shell 不受影响。source xxx.sh当前 shell 进程直接执行脚本不创建子进程脚本中修改的环境变量直接作用于当前终端。Q5子进程修改环境变量会影响父进程吗不会。fork 之后发生写时拷贝父子进程环境表相互独立子进程修改属于自己的副本不会影响父进程。九、小结环境变量是以keyvalue存储在进程环境表中的字符串是进程上下文的组成部分核心特点是 fork 创建子进程时可以被子进程继承。 PATH 是日常开发最常用的环境变量控制系统去哪里寻找可执行程序。 我们既可以在 shell 命令行操作环境变量也可以在 C 代码中读取环境变量。区分临时生效、永久生效理解父子进程环境变量继承规则是本章核心。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑