09.Linux环境变量
环境变量基本概念
什么是环境变量?
首先要考虑为什么咱们自己写的指令需要./
命令呢?就是因为系统并不知道程序在哪里,如果想要让自己写的程序可以直接执行,就要把程序拷贝到 /usr/bin目录下,这样系统就可以找到然后直接运行。
环境变量是 操作系统中用于配置系统行为的一组动态值。它们像是系统的“设置项”,可以影响程序的运行方式。
在 Linux 中,环境变量通常是一些 键值对,比如:
PATH=/usr/local/bin:/usr/bin:/bin
这表示变量 PATH
的值是多个路径组成的列表,用冒号分隔。
环境变量的作用
环境变量可以:
- ✅ 控制程序的默认行为(比如语言、路径)
- ✅ 传递配置信息给 shell 或其他程序
- ✅ 设置用户级别或系统级别的参数
常见环境变量举例
变量名 | 作用 |
---|---|
PATH | 告诉系统去哪些目录查找可执行文件 |
HOME | 当前用户的主目录路径 |
USER | 当前登录的用户名 |
SHELL | 当前使用的 shell 类型(如 bash) |
LANG | 系统语言设置 |
PWD | 当前工作目录 |
查看环境变量的方法
echo $PATH
测试HOME(这个可以标识当前是谁在使用Linux)
可以观察到在修该权限之后,HOME这个键值也发生了改变
环境变量相关的命令
命令 | 作用说明 | 示例 |
---|---|---|
echo | 显示某个环境变量的值 | echo $PATH 显示路径变量 |
export | 设置一个新的环境变量,并使其对子进程可见 | export MY_VAR="hello" |
env | 显示当前所有环境变量 | env |
unset | 清除某个环境变量 | unset MY_VAR |
set | 显示所有 shell 变量(包括环境变量和本地变量) | set |
🧠 小提示:
export
是让变量“走出当前 shell”,对子进程有效。set
显示的内容比env
更全面,包括函数定义和本地变量。unset
删除变量后,echo $变量名
会输出空值。
对于这句话:“export
是让变量走出当前 shell,对子进程有效”,我想再来讲一讲
🧠 什么是 shell 和子进程?
在 Linux 中:
- shell 是你当前操作的命令行环境,比如 bash。
- 当你运行一个程序(比如
ls
、python
、vim
),shell 会创建一个新的 子进程 来执行它(大多数情况下,执行一个命令确实会创建一个新的子进程)。
🧪 举个例子:变量不 export 会怎样?
MY_VAR="hello"
bash
echo $MY_VAR
解释:
- 第一行:你在当前 shell 设置了变量
MY_VAR
。 - 第二行:你打开了一个新的 shell(子进程)。
- 第三行:你尝试在子进程中读取
MY_VAR
。
👉 结果是:什么都不会输出,因为这个变量没有“走出去”。
✅ 使用 export
后的效果
export MY_VAR="hello"
bash
echo $MY_VAR
👉 这次你会看到输出:hello
为什么?
export
把变量放进了环境变量表中。- 子进程启动时会继承这个环境变量表。
- 所以子进程也能访问这个变量。
🔍 总结
情况 | 子进程能否访问变量? |
---|---|
MY_VAR="hello" | ❌ 不可以 |
export MY_VAR="hello" | ✅ 可以 |
man函数的三个参数
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
int main(int argc, int* argv[])
{for(int i=0;i<argc;i++){printf("argc[%d]-> %s\n",i,argv[i]);}return 0;
}
在终端输入命令之后会发现这样的输出
./mycmd -a -b -c
所以我们可以知道argc保存了我们输入字符串的个数,argv是一个指针数组,我们输入的字符串都会被解析然后进行存储。
接下来我们一起看看env参数
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
int main(int argc, int* argv[], char* env[])
{for(int a=0; env[a]; a++){printf("env[%d]->%s\n",a,env[a]);}return 0;
}
在执行程序之后会看到这样的输出

在 CentOS(或任何 Linux 系统)中,获取环境变量的方式主要有三种。
🧪 方式一:使用 echo
命令
这是最直接的方式,用于查看某个环境变量的值。
✅ 示例代码:
echo $PATH
echo $HOME
echo $USER
📘 说明:
$PATH
:显示系统查找命令的路径列表$HOME
:当前用户的主目录$USER
:当前登录的用户名
🧪 方式二:使用 printenv
或 env
命令
这两个命令可以列出当前所有环境变量,也可以查看某个指定变量。
✅ 示例代码:
printenv # 显示所有环境变量
printenv PATH # 查看 PATH 变量
env # 也可以显示所有环境变量
📘 说明:
printenv
和env
的输出格式是KEY=VALUE
- 适合用于脚本或调试环境配置
🧪 方式三:使用 getenv()
函数(在 C/C++ 程序中)
如果你在写 C 或 C++ 程序,可以用 getenv()
来获取环境变量。
✅ 示例代码(C语言):
#include <stdio.h>
#include <stdlib.h>int main() {char* path = getenv("PATH");if (path != NULL) {printf("PATH = %s\n", path);} else {printf("PATH not found.\n");}return 0;
}
✅ 总结表格
方法 | 使用场景 | 示例命令或代码 |
---|---|---|
echo | 查看单个变量 | echo $PATH |
printenv / env | 查看所有或指定变量 | printenv , env , printenv HOME |
getenv() | 在 C/C++ 程序中读取 | getenv("PATH") |
现在有一个问题
- 我在终端输入hello=99,此时这是一个本地变量也就是只在当前进程有效,可以前面我已经知道,每执行一个命令就会创建一个子进程或者说新的bash但是为什么我使用echo $helllo依然可以获得数值呢
输入了:
hello=99
echo $hello
你发现 echo $hello
能正确输出 99
,但你以为每执行一个命令都会创建一个子进程,变量应该“丢失”了。为什么没有丢失呢?
✅ 关键点:命令之间是否创建子进程,取决于命令的类型和执行方式
🔸 情况一:你在同一个 shell 中连续执行命令
hello=99 # 设置变量(本地变量)
echo $hello # 读取变量(仍在当前 shell)
这两个命令都是在 当前 shell 进程中执行的,没有创建新的子进程。所以变量 hello
是可见的。
🔸 情况二:你执行的是外部命令或脚本
如果你运行一个脚本或外部程序,它会创建一个子进程:
hello=99
bash -c 'echo $hello' # 输出为空
这里可以使用CTRL+d来退出当前的这个进程
再执行就可以看见输出
这里 bash -c
启动了一个新的 shell 子进程,它不会继承当前 shell 的本地变量,除非你用 export
:
export hello=99
bash -c 'echo $hello' # 输出 99
✅ 总结:什么时候变量可见?
情况 | 是否能访问本地变量 |
---|---|
当前 shell 中连续执行命令 | ✅ 可以 |
子进程(如 bash、脚本)中执行 | ❌ 不可以(除非 export) |
🧠 类比理解:变量是“桌上的便签”
- 当前 shell 就像你的办公桌,变量是你写的便签。
- 如果你自己看(echo),当然能看到。
- 如果你叫别人(子进程)来帮忙,他们看不到你的便签,除非你贴到墙上(export)。
你可以试试这个实验来验证:
hello=99
bash -c 'echo $hello' # 空
export hello=99
bash -c 'echo $hello' # 输出 99