在 Unix 或类 Unix 系统中,执行 shell 脚本时,可以直接运行脚本文件或者使用 source(在某些 shell 中也称为 .)命令。这两种方法的主要区别在于它们如何影响当前的 shell 环境。
直接执行 Shell 脚本
当你直接执行一个 shell 脚本时(例如,./script.sh 或 sh script.sh),会发生以下事情:
- 创建新的子 shell:脚本在新的子 shell 中运行,而不是在当前 shell 中运行。
- 环境隔离:在脚本中所做的任何更改(如设置变量、更改目录、设置环境变量等)仅限于该子 shell,并不影响当前 shell。
- 结束后恢复:脚本执行完毕后,子 shell 退出,任何在脚本中做的更改都会丢失,当前 shell 的环境保持不变。
示例
假设有一个脚本 script.sh:
#!/bin/bash
cd /path/to/directory
export VAR=value
运行 ./script.sh 后,当前 shell 的工作目录和环境变量 VAR 不会改变。
使用 source 执行 Shell 脚本
当你使用 source script.sh 或 . script.sh 执行脚本时,会发生以下事情:
- 当前 shell 运行:脚本在当前 shell 中执行,而不是在新的子 shell 中。
- 环境更改:脚本中所做的任何更改都会反映在当前 shell 中。这包括变量设置、目录更改等。
- 持久影响:脚本执行完成后,所有更改都保留在当前 shell 中。
示例
如果使用 source script.sh 或 . script.sh 运行上面的同一个脚本,当前 shell 的工作目录会更改为 /path/to/directory,且环境变量 VAR 会设置为 value。
总结
- 直接执行:创建新的子 shell,不影响当前 shell 的环境,脚本执行完毕后所有更改都会丢失。
- 使用
source:在当前 shell 中执行脚本,对当前 shell 的环境有持久影响。
根据你的需求选择使用哪种方式来执行 shell 脚本。如果你需要在当前 shell 中保留脚本的更改,应该使用 source。如果你想避免脚本更改当前 shell 的环境,可以直接运行脚本。