当前位置: 首页 > 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.jsqmd.com/news/82717/

相关文章:

  • TensorFlow艺术生成技术完全指南:StyleNet与DeepDream深度解析
  • JavaScript数据压缩库测试终极指南:从入门到精通
  • 31、Qt 常用小部件介绍
  • Whisper语音识别模型完整解析:从原理到实战应用
  • AI写论文那个最好用:宏智树AI凭何登顶“学术神器”榜首?
  • 网络安全应急响应标准流程(SOP)详解:抓住处置黄金时间
  • 微信小程序wxapkg文件深度解析:unwxapkg技术实现全揭秘
  • 基于强化学习的AI工具使用优化方法解析
  • 算法突破宝典:Learn-Algorithms项目实战全攻略
  • Python性能测试终极指南:pyperf模块完整教程
  • AI写论文哪个软件最好?我们实测了5款主流工具后发现:真正适合毕业论文的,不是“写得快”,而是“写得稳、查得到、改得了”
  • 网络安全入行真相:是普通人也能抓住的红利,还是又一个内卷深坑?
  • 机器翻译:用python从零到一基于 t5_translate_en_ru_zh_small_1024 模型实现翻译工具
  • 70、利用Python的C API扩展Python
  • 为什么前些年太多人挤破脑袋进网安?
  • 机器翻译:一文掌握离线翻译库 Argos Translate 的详细使用
  • 22、《图形绘制与操作全解析》
  • ESP32-S3脉冲计数精准优化实战指南:从误差根源到性能验证的完整解决方案
  • C# 进阶必备:核心模块(List / 泛型 / IO 流)底层原理与实战手册
  • [驱动之路——中断子系统]万字长篇,新手友好,一文彻底搞懂中断子系统(含驱动框架解析、代码分析)
  • AI写论文终极测评:宏智树AI凭何成为“学术救星”中的隐藏冠军?
  • 计算机毕业设计springboot健身工作室管理系统 基于SpringBoot的私教工作室运营平台设计与实现 SpringBoot驱动的健身会所综合信息管理与预约系统
  • 125_尚硅谷_闭包最佳实践和分析
  • 2025年广州PCB加工企业口碑TOP5推荐,华创精密实力凸 - 工业品牌热点
  • 小米员工爆料:有些部门,当你超过36岁之后,反而是“越老越吃香”!
  • 11111
  • 2025年工业电机定制TOP5推荐:工业电机定制哪家技术专业 - 工业推荐榜
  • 31、Red Hat 认证故障排除技能全解析
  • 计算机毕业设计springboot遵义红色文化宣传系统 基于 SpringBoot 的黔北红色记忆数字化传播平台 SpringBoot 框架下的遵义革命文化多媒体展示系统
  • 浏览器控制台如何清缓存重加载