当前位置: 首页 > news >正文

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是“你自己做这件事”。
前者隔离干净,后者共享状态。根据需求选择即可。

http://www.cnnetsun.cn/news/37323.html

相关文章:

  • Linux shell 进阶教程:单引号会禁止变量展开
  • 如何让AI工作流真正理解你的业务场景?
  • 如何快速安装Sionna:面向新手的完整配置教程
  • SketchUp STL插件实战手册:从建模到3D打印的完整流程
  • 零基础玩转AI音乐风格识别:Magenta实战指南
  • 零基础玩转智能配色:Color Thief色彩提取实战指南
  • 64K上下文新标杆:LongAlign-13B-64k如何重塑长文本处理范式
  • 仓颉编程语言完整入门指南:从零开始快速上手
  • 37、KDE 常用小部件介绍
  • 智能决策引擎:制造业流程优化的AI革命
  • Python性能测试终极指南:pyperf模块完整教程
  • ComfyUI效率节点终极完整教程:一键部署方法与工作流程优化指南
  • Flink SQL Top-N 深度从“实时榜单”到“少写点数据”
  • IndraDB图数据库终极指南:Rust技术栈的架构革命
  • 如何用影刀RPA自动化采集小红书作品评论?支持"视频图文+折叠评论"采集
  • 5分钟快速上手NI-VISA:虚拟仪器通信终极指南
  • 5个技巧让SSH连接像钢铁侠战衣一样坚不可摧
  • 毕业论文之战:选择通用的“速成写手”,还是专业的“深度宏智树AI”?
  • AI写论文终极测评:宏智树AI凭何成为“学术救星”中的隐藏冠军?
  • PPT模板哪家好:2025年12月深度测评排名前五推荐
  • GB28181协议终极测试指南:自动化工具完整解决方案
  • openpnp - 确定自动换刀坐标的辅助工装
  • 71、深入探索:Python C API 的扩展与嵌入
  • Ultimate Vocal Remover终极安装指南:全平台快速配置与性能优化
  • Ubuntu 20.04终极指南:快速解决L515相机RealSense SDK兼容性问题
  • 济南市发明专利和实用新型专利的根本区别
  • 济南市发明专利快速授权的三种途径
  • 36、Linux系统技术指南:从基础操作到高级配置
  • GLM-4.5-Air智能体模型终极部署指南:从零到高效推理
  • Hugo Academic CV 终极指南:5分钟打造专业学术简历