在 Linux 或 macOS 终端中,我们经常需要执行脚本来设置环境变量、运行程序等。其中,source env.sh 和 ./env.sh 都可以用来执行 env.sh 脚本,但它们有本质上的区别。
1. source env.sh(或 . env.sh)
source 命令用于在当前 Shell 进程中执行脚本,它不会创建新的子进程,而是直接在当前 Shell 环境中运行脚本内容。
特点
- 影响当前 Shell 环境:如果
env.sh里有export VAR=value,执行后当前 Shell 会保留该变量。 - 适用于环境变量配置:常用于加载
.bashrc、.profile或其他环境变量文件。 - 无需执行权限:即使
env.sh没有可执行权限 (chmod +x env.sh),依然可以使用source env.sh运行。
示例
$ echo 'export MY_VAR="Hello"' > env.sh
$ source env.sh
$ echo $MY_VAR
Hello # 变量生效2. ./env.sh
./env.sh 直接执行脚本,但它是在新的子 Shell 进程中运行,不会影响当前 Shell 进程的环境变量。
特点
- 创建新 Shell 进程:脚本的所有操作都在子进程中进行,脚本结束后子进程销毁,变量不会影响当前 Shell。
- 需要执行权限:如果
env.sh没有+x权限,需要先运行chmod +x env.sh。 - 适用于独立任务:适用于执行一个独立的 Shell 任务,如编译代码、运行脚本等。
示例
$ chmod +x env.sh
$ ./env.sh
$ echo $MY_VAR
# 没有输出,因为变量只在子进程中生效,当前 Shell 不受影响3. 主要区别总结
区别 |
|
|
运行方式 | 在当前 Shell 运行 | 在新的子进程运行 |
影响当前环境变量 | 是 | 否 |
是否需要执行权限 | 不需要 | 需要 ( |
适用场景 | 载入环境变量、修改当前 Shell | 运行独立任务 |
4. 什么时候用 source,什么时候用 ./?
✅ 使用 source env.sh
- 需要修改当前 Shell 的环境变量(如
export PATH)。 - 需要加载配置文件,如
.bashrc、.profile、虚拟环境等。
✅ 使用 ./env.sh
- 运行一个独立的 Shell 脚本,不希望影响当前 Shell。
- 需要执行包含逻辑(如编译、部署)的脚本。
5. source 和 exec 的区别
如果想用 ./env.sh 影响当前 Shell,可以用 exec 替代:
exec ./env.sh但 exec 会直接替换当前 Shell 进程,不会回到原来的 Shell,需要谨慎使用。
6. 总结
source env.sh 适用于修改当前 Shell 环境,./env.sh 适用于运行独立的脚本。如果脚本需要设置环境变量供当前 Shell 使用,应使用 source,否则使用 ./ 运行即可。
















