source和直接执行脚本的区别

779 阅读2分钟

在 Unix 或类 Unix 系统中,执行 shell 脚本时,可以直接运行脚本文件或者使用 source(在某些 shell 中也称为 .)命令。这两种方法的主要区别在于它们如何影响当前的 shell 环境。

直接执行 Shell 脚本

当你直接执行一个 shell 脚本时(例如,./script.shsh script.sh),会发生以下事情:

  1. 创建新的子 shell:脚本在新的子 shell 中运行,而不是在当前 shell 中运行。
  2. 环境隔离:在脚本中所做的任何更改(如设置变量、更改目录、设置环境变量等)仅限于该子 shell,并不影响当前 shell。
  3. 结束后恢复:脚本执行完毕后,子 shell 退出,任何在脚本中做的更改都会丢失,当前 shell 的环境保持不变。

示例

假设有一个脚本 script.sh

#!/bin/bash
cd /path/to/directory
export VAR=value

运行 ./script.sh 后,当前 shell 的工作目录和环境变量 VAR 不会改变。

使用 source 执行 Shell 脚本

当你使用 source script.sh. script.sh 执行脚本时,会发生以下事情:

  1. 当前 shell 运行:脚本在当前 shell 中执行,而不是在新的子 shell 中。
  2. 环境更改:脚本中所做的任何更改都会反映在当前 shell 中。这包括变量设置、目录更改等。
  3. 持久影响:脚本执行完成后,所有更改都保留在当前 shell 中。

示例

如果使用 source script.sh. script.sh 运行上面的同一个脚本,当前 shell 的工作目录会更改为 /path/to/directory,且环境变量 VAR 会设置为 value

总结

  • 直接执行:创建新的子 shell,不影响当前 shell 的环境,脚本执行完毕后所有更改都会丢失。
  • 使用 source:在当前 shell 中执行脚本,对当前 shell 的环境有持久影响。

根据你的需求选择使用哪种方式来执行 shell 脚本。如果你需要在当前 shell 中保留脚本的更改,应该使用 source。如果你想避免脚本更改当前 shell 的环境,可以直接运行脚本。