在 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. 主要区别总结

区别

source env.sh

./env.sh

运行方式

在当前 Shell 运行

在新的子进程运行

影响当前环境变量

是否需要执行权限

不需要

需要 (chmod +x)

适用场景

载入环境变量、修改当前 Shell

运行独立任务


4. 什么时候用 source,什么时候用 ./

使用 source env.sh

  • 需要修改当前 Shell 的环境变量(如 export PATH)。
  • 需要加载配置文件,如 .bashrc.profile、虚拟环境等。

使用 ./env.sh

  • 运行一个独立的 Shell 脚本,不希望影响当前 Shell。
  • 需要执行包含逻辑(如编译、部署)的脚本。

5. sourceexec 的区别

如果想用 ./env.sh 影响当前 Shell,可以用 exec 替代:

exec ./env.sh

exec 会直接替换当前 Shell 进程,不会回到原来的 Shell,需要谨慎使用。


6. 总结

source env.sh 适用于修改当前 Shell 环境./env.sh 适用于运行独立的脚本。如果脚本需要设置环境变量供当前 Shell 使用,应使用 source,否则使用 ./ 运行即可。