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)。

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

相关推荐
欲买桂花同载酒58219 小时前
程序人生-Hello’s P2P
运维·服务器·数据库
NineData19 小时前
AI时代的数据对比:DBA还需要盯着屏幕看差异吗?
运维·数据库
jyfool19 小时前
Ubuntu 远程桌面配置踩坑实录:从 TightVNC 到 x11vnc 的折腾之旅
linux·运维·ubuntu
网硕互联的小客服19 小时前
服务器防火墙是如何区分正常流量和攻击流量?
运维·服务器·网络
安当加密20 小时前
基于 RADIUS 的 Linux 服务器双因子认证:从 FreeRADIUS 到轻量级 ASP 方案的演进
linux·运维·服务器
66清小风20 小时前
服务器安装操作系统报X or window manager startup failed, falling back to mode
linux·kylin
A-刘晨阳20 小时前
【Prometheus】Alertmanager配置钉钉告警
运维·云原生·钉钉·prometheus·监控
wangqiaowq21 小时前
llama.cpp 启动命令优化
运维·服务器
double2li21 小时前
linux/unix 段错误捕获【续】
linux·运维·服务器·网络·unix
allway221 小时前
Linux / Unix last Command Examples
linux·运维·unix