news 2026/4/3 6:25:43

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/3/21 11:00:26

赋能机械产业数字化升级 ,哲霖软件斩获 “莞创杯” 双项大奖

2025 年 12 月 10 日,“莞创杯” 东莞市创新创业大赛决赛在东莞人力资源服务产业园落下帷幕。凭借对机械设备行业的深度洞察与创新数字化解决方案,哲霖软件 “机械设备行业数字化管理专家” 项目,从全国 84 个优质项目中突围,一举…

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

YASB:打造属于你的个性化Windows状态栏体验

YASB:打造属于你的个性化Windows状态栏体验 【免费下载链接】yasb A highly configurable Windows status bar written in Python. 项目地址: https://gitcode.com/gh_mirrors/yas/yasb 在数字时代,桌面效率已成为工作与生活的重要一环。YASB&am…

作者头像 李华
网站建设 2026/3/31 23:05:39

微信小程序wxapkg文件深度解析:unwxapkg技术实现全揭秘

微信小程序wxapkg文件深度解析:unwxapkg技术实现全揭秘 【免费下载链接】unwxapkg WeChat applet .wxapkg decoding tool 项目地址: https://gitcode.com/gh_mirrors/un/unwxapkg 微信小程序开发中,wxapkg文件作为核心资源包承载着小程序的完整代…

作者头像 李华
网站建设 2026/3/31 8:42:57

23、图形操作与动画实现全解析

图形操作与动画实现全解析 1. 图形基础信息获取 在图形处理中,我们可以通过特定的函数获取每个点的颜色总数或灰度级数。例如,调用 numColors() 函数能返回每个点的颜色总数,而调用 depth() 函数则可以将相同的信息以每个点的位数形式报告出来。 2. 图形适配窗口 我们…

作者头像 李华
网站建设 2026/4/3 5:03:07

27、Qt中字符串与日期时间操作的深入解析

Qt中字符串与日期时间操作的深入解析 在软件开发中,字符串和日期时间的处理是非常常见的需求。Qt作为一个强大的跨平台应用程序开发框架,提供了一系列方便的类和方法来处理这些任务。本文将详细介绍Qt中QString、QStringList、定时器以及QDate类的使用。 QString的基本操作…

作者头像 李华
网站建设 2026/4/3 4:01:59

29、软件国际化与配置指南

软件国际化与配置指南 1. 国际化概述 在当今互联网时代,软件的国际化变得至关重要。实现软件的多语言支持,能让软件在全球范围内更广泛地使用。下面将详细介绍软件国际化的相关内容,包括可翻译字符串的声明、翻译文件的构建、Unicode 字符处理以及配置信息的保存。 2. 可…

作者头像 李华