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

引言

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

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

5. 总结

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

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

相关推荐
贵州诚鑫致达科技有限公司2 小时前
Linux的yum源怎么重启?源不是服务
linux·运维·服务器
遇印记3 小时前
传输层,网络层
运维·服务器·网络·windows·学习
品牌常新3 小时前
景区巡逻机器人怎么选?派宝S5全地形守护解析
运维·人工智能·机器人
Elastic 中国社区官方博客3 小时前
一条 ES|QL 查询,涵盖365天的审计日志:在热数据和可搜索快照上执行相同的搜索
大数据·运维·服务器·elasticsearch·搜索引擎·全文检索
澜山奕秋5 小时前
RHCSA
linux·运维·服务器
Web极客码6 小时前
告别流式截断:我用客户端中间件解决长文本 API 跨国 SSE 断连与数据自愈
linux·agent 图
cnnews6 小时前
Chromebox3安装Ubuntu后内存化与最小化 eMMC 写入优化
linux·运维·ubuntu
AliCloudROS6 小时前
OOS ChatOps Agent 定时任务:每天 9 点,让Agent 在钉钉群里交运维报告
运维·自动化运维
CALL158119098456 小时前
SVHC 247项与附录XVII限制物质,REACH测试项目有哪些?
运维·安全·安全性测试