在Linux中,source
和bash
(或sh
)都是用于执行Shell脚本的命令,但它们在执行方式和作用域上有显著区别:
1. 执行方式
-
bash script.sh
(或sh script.sh
)- 启动一个新的子Shell进程来执行脚本。
- 脚本中的变量、函数、别名等仅在子Shell中生效,父Shell环境不会受到影响。
- 脚本执行完毕后,子Shell退出,所有修改随之消失。
-
source script.sh
(或. script.sh
)- 直接在当前Shell环境中执行脚本,不创建子Shell。
- 脚本中对环境变量、路径、函数等的修改会直接影响当前Shell会话。
- 常用于加载配置文件(如
~/.bashrc
)或更新当前环境。
2. 作用域对比
场景 | bash script.sh | source script.sh |
---|---|---|
变量定义 | 仅在子Shell中有效 | 当前Shell中生效 |
修改PATH 等环境变量 | 不影响当前Shell | 直接影响当前Shell |
执行后退出 | 子Shell终止,修改丢失 | 修改持久保留 |
3. 典型用途
-
bash
适合运行独立脚本,无需影响当前环境(例如工具脚本、测试任务)。 -
source
需要修改当前Shell状态时使用,例如:source ~/.bashrc # 重新加载配置 source venv/bin/activate # 激活Python虚拟环境
4. 其他区别
- 权限要求
bash script.sh
需要脚本有可执行权限(或通过解释器显式调用),而source
不需要。 - 调试
bash -x script.sh
可以调试脚本,而source
的调试需结合set -x
。
示例验证
假设脚本test.sh
内容:
#!/bin/bash
export VAR="hello"
- 执行
bash test.sh
后,echo $VAR
输出为空(变量未保留)。 - 执行
source test.sh
后,echo $VAR
输出hello
(变量已生效)。