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 天前
IDV云桌面vDisk机房网络管控访问限制部署方案
运维·服务器·网络
ShineWinsu1 天前
对于Linux:动静态库的制作与原理的解析—下
linux·运维·服务器·进程·链接·虚拟地址空间·
RH2312111 天前
2026.4.16Linux 管道
java·linux·服务器
handler011 天前
Linux: 基本指令知识点(2)
linux·服务器·c语言·c++·笔记·学习
liuyukuan1 天前
如何在win11上打开 WSL2(Windows 的 Linux 子系统)?
linux·windows
KKKlucifer1 天前
国内堡垒机如何打通云网运维安全一体化
运维·安全
橙子也要努力变强1 天前
Linux信号机制
linux·服务器·网络
shughui1 天前
FinalShell / Xshell 完整教程(下载+安装+使用,2026最新版)
linux·fiddler·xshell·xftp·finalshell·远程连接工具
wydd99_lll1 天前
docker特权模式下逃逸
运维·docker·容器
程序猿编码1 天前
给你的网络流量穿件“隐形衣“:手把手教你用对称加密打造透明安全隧道
linux·开发语言·网络·安全·linux内核