Linux Shell脚本执行方式全解析:source、点号、路径、bash与exec的区别

引言

在Linux开发中,执行Shell脚本的方式多样,但不同方式对进程和环境的影响常被混淆。你是否遇到过变量不生效、终端意外退出或环境切换失败?本文将全面解析source.、直接路径、bashexec五种方式,通过实例演示其核心差异。


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. 实战场景

  1. 环境配置
    使用source ~/.bashrc使配置立即生效。
  2. 独立任务
    使用./task.sh避免污染当前环境。
  3. 容器启动
    使用exec作为容器入口点(如Docker的CMD ["exec", "app.sh"]),确保进程信号正确传递。

5. 总结

  • 需要持久化环境 :选择source.
  • 运行独立任务 :选择直接路径或bash
  • 完全切换环境 :选择exec(注意会退出当前shell)。

正确选择执行方式,可提升脚本的可靠性与安全性。

相关推荐
未济1 天前
linux 配置环境变量
linux
傲世仙尊1 天前
目录即文件-Ext文件系统收尾篇
linux·c语言
虎头金猫1 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
_艾伦 耶格尔.2 天前
进程间通信
linux
AI职业加油站2 天前
AI智能体应用工程师证书:政策红利下的职业新风口
大数据·运维·人工智能·学习·职场发展
Liuqy-052 天前
Linux IO编程——静态库、动态库
linux
此冬歌咏2 天前
K8s 节点故障实战:优雅驱逐 31 秒,硬故障 331 秒,以及那个永远 Pending 的 Pod
运维·k8s
彧azz2 天前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试
-梅2 天前
linux(8) 软硬链接
linux·运维·服务器
AIgorithmGEEK2 天前
[Linux]线程三部曲(上):一个执行流的诞生——从操作系统一路拆到 pthread_create
linux·线程·pid