set 和 export 都是用于设置变量的命令,但它们的 适用环境、作用范围 和 功能 有本质区别,核心差异在于 是否将变量提升为“环境变量”(可被子进程继承) 以及 支持的操作系统/shell。
一、set 命令:主要用于“设置shell变量”或“临时变量”
set 是一个跨shell的基础命令,但在不同环境中功能略有差异:
1. 在 Linux/macOS 的 shell(如 bash、zsh)中:
-
功能:主要用于 定义“shell变量”(局部变量),或显示当前shell中的所有变量。
-
特点:
- 通过
set 变量名=值定义的变量,仅在当前shell会话中有效,但 不会被子进程继承(即不是“环境变量”)。 - 子进程(如在当前shell中启动的脚本、程序)无法读取这些变量。
- 通过
-
示例:
# 在bash中用set定义变量 set TEST_VAR="hello" #特别注意:等号两侧留空格( set TEST_VAR = "hello" )是错误的 echo $TEST_VAR # 输出:hello(当前shell可见) # 启动子进程(新的bash),检查变量是否可见 bash -c 'echo $TEST_VAR' # 输出空(子进程不可见,因为不是环境变量)
2. 在 Windows 的 CMD 命令提示符 中:
-
功能:用于 设置“临时环境变量”(仅在当前CMD会话中有效)。
-
特点:
- 通过
set 变量名=值定义的变量,是环境变量,可被当前CMD会话中的子进程继承(如启动的程序、脚本)。 - 关闭CMD窗口后,变量失效(非永久)。
- 通过
-
示例:
:: 在CMD中用set定义变量 set TEST_VAR=hello echo %TEST_VAR% # 输出:hello(当前CMD可见) :: 启动子进程(如Python脚本),可读取该变量 python -c "import os; print(os.getenv('TEST_VAR'))" # 输出:hello(子进程可见)
二、export 命令:仅用于“导出环境变量”(Linux/macOS 专属)
export 是 Linux/macOS 的 shell(如 bash、zsh) 特有的命令,Windows 系统(CMD/PowerShell)不支持。
-
核心功能:将“shell变量”提升为“环境变量”,使其 可被子进程继承。
-
两种用法:
- 直接定义并导出环境变量:
export 变量名=值 - 先定义shell变量,再导出:
变量名=值; export 变量名
- 直接定义并导出环境变量:
-
示例:
# 方法1:直接定义并导出 export TEST_VAR="hello" # 方法2:先定义,再导出 TEST_VAR="hello" export TEST_VAR # 当前shell可见 echo $TEST_VAR # 输出:hello # 子进程可见(环境变量的核心特性) bash -c 'echo $TEST_VAR' # 输出:hello(子进程可读取)
在 Linux/macOS 中,通过 export 命令设置的环境变量 默认是临时的,仅在当前 shell 会话(终端窗口)中有效,关闭终端后就会失效。
如何实现永久生效?
若需让 export 设置的环境变量永久生效(即每次打开终端都自动加载),需将 export 命令写入 shell 的配置文件中。不同 shell(如 bash、zsh)的配置文件不同,常见的有:
- bash shell:
~/.bashrc(非登录 shell)或~/.bash_profile(登录 shell) - zsh shell:
~/.zshrc - 通用:
~/.profile(部分系统支持)
步骤:
① 编辑配置文件(以 bash 为例):
bash nano ~/.bashrc # 或用 vim、gedit 等编辑器
② 在文件末尾添加 export 命令:
bash export API_KEY="123456" # 你的环境变量设置
③ 保存并退出编辑器,执行以下命令让配置立即生效(无需重启终端):
bash source ~/.bashrc # 或 . ~/.bashrc
此后,每次打开新终端,该环境变量都会自动加载。
三、二者区别总结
| 维度 | set(Linux/macOS bash) | export(Linux/macOS bash) | set(Windows CMD) |
|---|---|---|---|
| 适用系统 | Linux/macOS(bash/zsh等) | Linux/macOS(bash/zsh等) | Windows(CMD命令提示符) |
| 变量类型 | 局部shell变量(非环境变量) | 环境变量(可被子进程继承) | 临时环境变量(可被子进程继承) |
| 子进程可见性 | 不可见 | 可见 | 可见 |
| 持久性 | 仅当前shell会话有效 | 仅当前shell会话有效 | 仅当前CMD会话有效 |
| 典型用途 | 定义shell内部临时变量 | 定义需被子进程使用的环境变量(如API密钥) | 定义当前CMD会话中需用的临时环境变量 |
-
Windows 中没有
export:
Windows 的 CMD/PowerShell 中用set设置临时环境变量,用setx或图形界面设置永久环境变量(参考前文),没有export命令。 -
环境变量的核心特性是“可继承”:
无论是export(Linux)还是set(Windows CMD)设置的环境变量,核心作用是让子进程(如脚本、程序)能读取到,这是与普通局部变量的本质区别。 -
持久性与临时性:
set和export定义的变量默认都是“临时的”(当前会话有效),关闭终端后失效。- 若需永久生效,需写入配置文件(Linux 写入
~/.bashrc,Windows 通过setx或图形界面)。

929

被折叠的 条评论
为什么被折叠?



