news 2026/3/1 0:11:18

Linux shell进阶教程:sh和source调用子脚本的区别详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux shell进阶教程:sh和source调用子脚本的区别详解

在 Shell 脚本中,通过sh 1.shbash 1.shsource 1.sh. 1.sh调用子脚本,行为有本质区别,主要体现在执行环境(进程/作用域)变量/函数可见性上。


✅ 对比总结表

调用方式是否新建子进程能否修改父脚本变量能否继承父脚本变量能否使用父脚本函数执行速度典型用途
sh 1.sh✅ 是❌ 不能❌ 仅export❌ 不能稍慢独立任务、隔离执行
bash 1.sh✅ 是❌ 不能❌ 仅export❌ 不能稍慢同上(指定 bash)
source 1.sh❌ 否✅ 能✅ 全部✅ 能加载配置、共享状态
. 1.sh(点命令)❌ 否✅ 能✅ 全部✅ 能source(POSIX 标准)

🔍 详细解释

1.sh 1.shbash 1.sh:启动新进程

  • 创建一个新的 Shell 子进程来执行1.sh
  • 父脚本的普通变量(未export)对子脚本不可见
  • 子脚本中修改的变量不会影响父脚本
  • 子脚本无法调用父脚本定义的函数。
  • 即使子脚本中exit,也只退出子进程,不影响父脚本继续执行

📌 示例:

# parent.shname="Alice"shchild.sh# child.sh 里 echo $name → 空(除非 export name)echo$name# 仍为 "Alice"

2.source 1.sh. 1.sh:在当前 Shell 中执行

  • 不创建新进程,直接在当前 Shell 环境中逐行执行1.sh
  • 完全共享父脚本的变量、函数、当前目录、umask 等上下文
  • 子脚本中修改变量,父脚本能感知到变化
  • 如果子脚本中写了exit整个父脚本会退出
  • . 1.sh是 POSIX 标准写法,source是 Bash/Zsh 的别名,功能相同。

📌 示例:

# parent.shname="Alice"sourcechild.sh# child.sh 中 name="Bob" → 父脚本 name 变为 "Bob"echo$name# 输出 "Bob"

🛠 实际应用场景

场景推荐方式原因
加载配置文件(如.envsource config.sh需要将变量导入当前环境
执行独立部署任务bash deploy.sh隔离环境,避免污染父脚本
在脚本中复用函数库source lib.sh直接调用库中的函数
临时测试脚本sh test.sh不影响当前 Shell 状态
在 Dockerfile 或 CI 中运行sh entrypoint.sh通常需要独立进程

⚠️ 常见陷阱

  1. 误用exit
    在被source的脚本中写exit会导致整个终端或主脚本退出!

  2. 变量污染
    source时,子脚本的变量会覆盖父脚本同名变量(可用local限制作用域)。

  3. 路径问题
    source ./1.shsh ./1.sh$0$PWD的处理不同,影响相对路径解析。


✅ 最佳实践建议

  • 需要“导入”配置或函数?→ 用source.
  • 需要“运行”一个独立任务?→ 用shbash
  • 不确定时?→ 默认用sh更安全(隔离性好)
  • 写可移植脚本?→ 优先用. script.sh(POSIX 兼容)

💡 小技巧:查看当前是否在子 shell 中

echo$SHLVL# 每进一层子 shell +1

总结一句话:

sh是“请别人帮你做事”,source是“你自己做这件事”。
前者隔离干净,后者共享状态。根据需求选择即可。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/26 8:39:03

BaiduPanFilesTransfers:告别百度网盘手动转存的终极解决方案

BaiduPanFilesTransfers:告别百度网盘手动转存的终极解决方案 【免费下载链接】BaiduPanFilesTransfers 百度网盘批量转存工具 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduPanFilesTransfers 你是否曾经为了转存几个百度网盘分享链接,不得…

作者头像 李华
网站建设 2026/2/21 3:08:48

OpenWrt网络加速神器:迅雷快鸟插件终极配置指南

OpenWrt网络加速神器:迅雷快鸟插件终极配置指南 【免费下载链接】luci-app-xlnetacc OpenWrt/LEDE LuCI for XLNetAcc (迅雷快鸟) 项目地址: https://gitcode.com/gh_mirrors/lu/luci-app-xlnetacc 在当今高速网络时代,OpenWrt系统用户有了更好的…

作者头像 李华
网站建设 2026/2/28 15:39:03

NoHello终极指南:快速隐藏Root权限,打造安全防护屏障

NoHello终极指南:快速隐藏Root权限,打造安全防护屏障 【免费下载链接】NoHello A Zygisk module to hide root. 项目地址: https://gitcode.com/gh_mirrors/nohe/NoHello 🚀 你是否遇到过这样的困扰? 手机Root后&#xff0…

作者头像 李华
网站建设 2026/2/24 17:00:18

Maestro性能基准测试终极指南:建立UI响应时间标准

Maestro性能基准测试终极指南:建立UI响应时间标准 【免费下载链接】maestro Painless Mobile UI Automation 项目地址: https://gitcode.com/gh_mirrors/ma/maestro 想要确保你的移动应用UI测试既快速又可靠?Maestro作为一款现代化的移动UI自动化…

作者头像 李华
网站建设 2026/2/26 14:09:43

Windows命令行安装器Scoop终极指南:告别繁琐软件管理

Windows命令行安装器Scoop终极指南:告别繁琐软件管理 【免费下载链接】Scoop A command-line installer for Windows. 项目地址: https://gitcode.com/gh_mirrors/scoop4/Scoop 还在为Windows软件安装的种种烦恼而头疼吗?😩 那些没完没…

作者头像 李华
网站建设 2026/2/27 0:27:11

11个专业级Project模板助你项目管理事半功倍

11个专业级Project模板助你项目管理事半功倍 【免费下载链接】Project软件实用模板MPP文件11个场景模板 本仓库提供了一个名为“Project软件实用模板(MPP文件) 11个场景模板.zip”的资源文件下载。该文件包含了11个不同场景下的Project软件模板,适用于各种项目管理需…

作者头像 李华