引言
在Linux开发中,执行Shell脚本的方式多样,但不同方式对进程和环境的影响常被混淆。你是否遇到过变量不生效、终端意外退出或环境切换失败?本文将全面解析source、.、直接路径、bash和exec五种方式,通过实例演示其核心差异。
1. 核心概念:子shell与进程替换
- 当前shell:用户正在操作的终端进程。
- 子shell:由当前shell派生的子进程,独立于父进程。
- 进程替换:用新进程完全替换当前进程(原进程被销毁)。
2. 五种执行方式详解
2.1 source 与 . (点号)
命令 :source script.sh 或 . script.sh
机制 :在当前shell直接执行,不创建子shell 。
影响 :变量、函数、目录变更持久化 到当前shell;exit会退出当前shell。
适用 :加载配置文件(如.bashrc)、设置环境变量。
2.2 直接路径执行
命令 :./script.sh
前提 :脚本需可执行权限(chmod +x)。
机制 :在子shell 中执行。
影响 :变量、目录变更不持久化 ;exit仅退出子shell。
适用:独立任务脚本。
2.3 显式解释器(bash)
命令 :bash script.sh
机制 :在子shell 中执行(无需可执行权限)。
影响 :同直接路径执行。
适用:测试脚本、指定解释器版本。
2.4 exec 执行
命令 :exec script.sh
机制 :用脚本进程替换当前shell进程 (不创建子shell)。
影响 :脚本结束后当前shell退出 ;变量、目录变更不持久化 (因原进程被销毁)。
适用:登录shell切换、容器入口点、完全切换环境。
3. 完整对比表
| 执行方式 | 子shell | 进程替换 | 变量持久化 | cd影响当前目录 | exit影响当前shell |
|---|---|---|---|---|---|
| source 或 . | ❌ 否 | ❌ 否 | ✅ 是 | ✅ 是 | ✅ 是 |
| ./script.sh | ✅ 是 | ❌ 否 | ❌ 否 | ❌ 否 | ❌ 否 |
| bash script.sh | ✅ 是 | ❌ 否 | ❌ 否 | ❌ 否 | ❌ 否 |
| exec script.sh | ❌ 否 | ✅ 是 | ❌ 否 | ❌ 否 | ✅ 是(退出) |
4. 实战场景
- 环境配置 :
使用source ~/.bashrc使配置立即生效。 - 独立任务 :
使用./task.sh避免污染当前环境。 - 容器启动 :
使用exec作为容器入口点(如Docker的CMD ["exec", "app.sh"]),确保进程信号正确传递。
5. 总结
- 需要持久化环境 :选择
source或.。 - 运行独立任务 :选择直接路径或
bash。 - 完全切换环境 :选择
exec(注意会退出当前shell)。
正确选择执行方式,可提升脚本的可靠性与安全性。