news 2026/6/10 17:32:08

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/6/9 20:17:17

CAIE认证含金量透视:市场认可与企业背书的双重价值

01 行业背景:人工智能人才需求爆发 人工智能正从技术概念深度渗透至各行各业。根据全球知名市场研究机构沙利文的数据,2024年中国人工智能核心产业规模已突破7,000亿元人民币,标志着产业已进入高速发展的关键阶段。这场由AI驱动的生产力革命正…

作者头像 李华
网站建设 2026/6/9 18:35:28

24、图形操作与拖放功能详解

图形操作与拖放功能详解 1. 使用 QImage 访问像素值 QImage 对象可用于存储图像信息,并提供对单个像素信息的底层访问。以下是一个示例,创建一个 QPixmap,将其转换为 QImage 以修改像素颜色值,然后再转换回 QPixmap 进行显示。 QImage 有三种形式,每个像素可以包含 1 位…

作者头像 李华
网站建设 2026/6/10 14:05:26

安装MiniConda

下载地址http://www.anaconda.com/download/success添加环境变量D:\devtools\miniconda3D:\devtools\miniconda3\ScriptsD:\devtools\miniconda3\Library\bin创建一个基于python 3.13版本的虚拟环境conda create -n fastapi-ebv python3.13查看所有的虚拟环境conda env list删除…

作者头像 李华
网站建设 2026/6/10 14:04:19

HyPlayer:重新定义音乐播放体验的开源利器

HyPlayer:重新定义音乐播放体验的开源利器 【免费下载链接】HyPlayer 仅供学习交流使用 | 第三方网易云音乐播放器 | A Netease Cloud Music Player 项目地址: https://gitcode.com/gh_mirrors/hy/HyPlayer 在数字化音乐时代,一款优秀的播放器不仅…

作者头像 李华
网站建设 2026/6/9 19:19:16

39、窗口程序对比剖析及开发环境搭建

窗口程序对比剖析及开发环境搭建 在软件开发中,不同的窗口程序有着各自的特点和实现方式。下面我们将对 Win32、KDE 和 GNOME 窗口程序进行对比分析,并介绍相关软件的安装与开发环境的搭建。 Win32、KDE 和 GNOME 窗口程序对比 事件处理 KDE 程序 :在第 44 行,KDE 程序…

作者头像 李华
网站建设 2026/6/10 16:19:43

40、KDE/Qt 公共方法全面解析

KDE/Qt 公共方法全面解析 在 KDE 和 Qt 开发过程中,了解和掌握各种公共方法对于高效开发至关重要。本文将详细介绍一系列 KDE 和 Qt 小部件的公共方法,帮助开发者更好地使用这些方法进行开发。 方法列表概述 这里包含了所有 KDE 和 Qt 小部件的公共方法的按字母顺序排列的…

作者头像 李华