深入解析Shell脚本运行机制

一、引言:为什么掌握Shell脚本运行机理对开发者如此重要?

在Linux、Unix甚至现代macOS等各种服务器和开发环境中,Shell脚本是自动化运维、批量处理、开发部署、系统集成不可或缺的利器。无论是自动备份代码、批量配置服务器、定期分析日志,还是容器化、构建流水线、云原生调度,都离不开Shell脚本的灵活调度与强大整合力。

然而,许多人只是“会写会用”Shell脚本,却未能深入理解它背后的运行机制。为什么一段Shell脚本能像魔术一样按顺序执行?Shell又是如何“理解命令”,怎样与操作系统沟通?管道、重定向、环境变量、子进程又是如何工作的?Shell脚本的解释和执行过程究竟包含哪些环节?

本篇文章将以系统化的技术视角、工程细节、生活类比和案例实践,深入拆解Shell脚本是如何运行的。每一步都将揭示Shell从文本脚本到命令执行、从语法解析到进程调度、从环境配置到输出流转的全链条原理。无论你是运维工程师、后端开发、嵌入式专家还是云端架构师,都能从本篇文章获得脚本运行机制的全面认知和优化实践。


二、Shell脚本运行的“人生旅途”全流程

2.1 Shell是什么?(角色认知)

Shell(壳),其实是操作系统的“命令解释器”或“命令行界面”,负责连接用户、系统内核(Kernel)和外部程序的桥梁。它既是你在终端敲命令的窗口,也是脚本批处理的宿主环境。

常见Shell有:

  • bash(Bourne Again Shell):主流标准,强调兼容性与扩展性。
  • sh(Bourne Shell):早期标准,轻量级。
  • zsh:功能更强,交互体验更好。
  • csh、tcsh:语法偏C,少数场合用。
  • dash、ksh等:系统优化版。

重点:无论是哪种Shell,它们的工作本质是**“解释、解析并执行用户/脚本传递的命令”**。

2.2 Shell脚本“从出生到执行”的生命旅程

一句Shell脚本从你的文本文件到完成最后一个命令,通常流程如下——

  1. 文本写入脚本文件(.sh):包含一系列命令和控制语句,可能有变量、条件、循环、函数等。
  2. 用户或程序触发Shell执行脚本:比如bash myscript.sh或者./myscript.sh。
  3. Shell进程创建/启动:系统为Shell分配进程,初始化运行环境变量。
  4. 脚本文件读取与“解析”:Shell依次读取文件内容,将其“逐行”翻译理解。
  5. 词法/语法分析:处理关键字、变量、管道、重定向,解析为“命令序列树”或步骤列表。
  6. 环境变量配置:导入、继承环境变量(PATH、HOME、USER等)。
  7. 命令查找与分发:区分内建命令与外部程序,定位可执行文件。
  8. 实际命令执行:启动外部进程,执行命令/函数/脚本块,管理标准输入输出,捕捉结果与错误。
  9. 流程控制:IF、LOOP、CASE等流程语句由Shell本身解释实现,而不是由外部进程完成。
  10. 资源回收与脚本结束:Shell脚本结束时,进程回收,环境恢复。

每一步都蕴含了丰富机理和实现细节,尤其是Shell本身的“解释型”本质和与内核、进程、文件系统的交互机制。


三、Shell脚本执行的底层机制:从文本到命令的“变形记”

3.1 Shebang与脚本启动方式

(1)Shebang定义与作用

任何Shell脚本的第一行常常是:

#!/bin/bash

这被称为shebang(咒语行)。代表:当你通过./myscript.sh运行时,操作系统会根据shebang自动找到并启动对应的解释器。

比喻:Shebang就像给剧组演员指定了导演和剧本风格——“这出戏就让bash来导演”。

(2)启动模式区别
  • 直接解释:bash myscript.sh——Shell主动读取文本并解释。
  • 执行权限+shebang:chmod +x myscript.sh&./myscript.sh——操作系统通过shebang选定解释器。
  • 编写为可执行程序:复制到/usr/bin/等路径形成“命令脚本”。

3.2 读取与解析——Shell的“翻译官”角色

(1)逐行解析 VS 批量解析

Shell脚本采用逐行解释模式——不是一次性读取全部内容,而是逐行分析、逐步执行。每行可能包含复杂的子命令、变量、表达式,Shell会根据语法规则进行“词法分析、语法树构建、分步执行”。

(2)词法解析细节

举例:

echo"Hello,$USER"

Shell会:

  • 识别echo为内建命令(builtin)。
  • 识别$USER为变量,查找当前环境变量值。
  • 将整个命令解析为echo "Hello, <变量值>"。
  • 再将该命令交给内建命令模块处理。

3.3 内建命令与外部程序调用:分工协作

(1)内建命令示例

如echo、cd、export、read、if、for等,由Shell本身直接实现,无需创建新进程。优点是高效,实时,便于流程控制。

(2)外部命令执行

如ls、find、grep、awk、curl等:由Shell找到对应可执行文件,创建新的子进程(fork+exec),Shell负责调度和管理输入输出。

流程:

  • Shell本身父进程查找命令路径(PATH)。
  • 调用fork()复制自身进程,成为子进程。
  • 子进程通过execve()系统调用加载外部可执行文件。
  • 外部命令运行期间可与Shell交互(如管道、重定向)。

3.4 管道、重定向与标准流操作:脚本“流水线”的底层奥秘

(1)管道(|)

Shell允许用管道连接多个命令,将前一个命令的标准输出作为后一个命令的标准输入:

ls|grep".sh"

底层实现:

  • Shell暂时建立管道文件描述符,在两个子进程之间传递数据。
  • 实时调度,前后进程同步/异步分发数据流。
(2)输入输出重定向(>、>>、<)
echo"Hello">output.txtcat<input.txt

Shell通过操作系统的文件描述符机制,实现标准输出/输入的重定向、追加与覆盖。

(3)标准流捕捉与错误处理

Shell可捕捉命令的退出码,决定后续流程:

ifls/notexistdir;thenecho"Success"elseecho"Failed"fi

内部原理:

  • Shell执行完命令后,获取其exit code。
  • 基于该状态,判断流程跳转或终止。

3.5 变量、环境与作用域管理

(1)Shell变量 VS 环境变量
  • Shell变量:仅在当前Shell进程及脚本生命周期内有效。
  • 环境变量:通过export导出,能被子进程继承。

实际例子:

name="Alice"exportnamebashchild.sh# 子脚本可读取name变量
(2)变量替换与脚本解释

Shell在解析时遇到变量标识符$,会查找当前环境,替换实际值。支持参数展开、命令替换等复杂语法。


四、Shell脚本流程控制、复杂语法解析及“解释型”特性

4.1 流程控制结构:运行机制

(1)IF、CASE、FOR、WHILE语法解析

Shell处理流程结构时,并不像编译型语言那样直接汇编为机器指令,而是解释执行:

  • Shell读到if,先判断条件表达式的执行结果。
  • 通过语法树层层分解,决定执行真/假分支。
  • for和while通过迭代,每次遍历变量、执行块,Shell本身负责循环调度。
  • case语句根据匹配规则依次比较。

例子:

forfilein*.txt;doecho"Processing$file"done

Shell在逐行解释时,自动遍历文件列表,替换变量,调用命令,显示结果。

(2)函数定义与调用

Shell支持临时函数,比如:

myfunc(){echo"Hello$1"}myfunc"World"

本质是:

  • Shell读到函数定义后,存储函数体至内存。
  • 后续调用时,Shell根据参数替换、顺序解释,执行函数主流程。
  • 可以递归,但受Shell栈深限制。

4.2 执行与流程调度:单线程、异步与并发

(1)默认单步串行

Shell脚本通常是一行接一行、串行解释与执行,直到结束。

(2)子进程并发(&,wait)

通过&号和wait命令,可以实现子进程并发:

longjob1&longjob2&waitecho"All jobs done!"

Shell将每个命令交给后台子进程,主脚本等待所有任务完成再继续。

(3)命令组与脚本块

Shell允许用大括号{ }或子Shell( )组织命令组,实现批量控制和作用域隔离。

例:

{echo"Block start"lsecho"Block end"}

4.3 错误处理、异常捕获与退出码传递

Shell通过set语法加强脚本健壮性:

set-e# 错误即退出set-u# 未声明变量报错set-opipefail# 管道任一子命令失败即报错

结合trap命令,可以捕捉指定信号和执行清理动作。

例:

trap'cleanup'EXIT

五、Shell脚本与操作系统的互动之谜

5.1 Shell脚本与内核:进程的秘密合作

(1)进程间通信方式

Shell脚本每调用一个外部命令,都会建立新的“进程”,采用fork-exec机制,底层与内核紧密互动。Shell本身是“调度者”,而Linux/Unix内核是“执行者”。

管道、重定向、信号等,都是Shell通过系统调用实现:

  • fork(): 创建新进程
  • execve(): 替换进程映像为指定程序
  • dup2()和文件描述符管理:实现I/O重定向
(2)资源管理与回收

Shell本身负责清理子进程、关闭无用文件描述符、恢复环境变量,保障整个运行环境稳定。

5.2 与文件系统、网络、外部设备的交互机制

Shell脚本可直接读写文件、连接网络、管理设备,因为Shell脚本的命令就是“外部应用”调用:

  • 文件读写:cat、echo、touch等命令直接绑定文件系统接口。
  • 网络访问:curl、wget在Shell脚本中直接调用本地或远程服务。
  • 外部程序:sudo、systemctl等通过Shell封装系统级权限与服务。

六、Shell脚本的工程实践与优化技巧

6.1 典型应用场景

  • 运维自动化:如每天定时备份、数据同步、批量监控日志。
  • 批量处理:处理文件转换、图片缩放、数据库导出。
  • 应用部署与容器集成:Dockerfile中的ENTRYPOINT/启动命令,往往是Shell脚本。
  • 自动化测试:连续集成(CI)系统,用Shell串联编译、测试、发布流程。

6.2 脚本规范与优化建议

(1)参数化与健壮性
  • 推荐使用set -e防止脚本中断
  • 变量声明前校验、-u防止未赋值变量偷跑
  • 明确注释、模块化代码结构、外部配置文件分离
(2)日志记录与错误诊断
  • 用tee命令实现日志流同步输出和存档
  • trap捕捉异常,保证后续流程安全收尾
  • 使用exit和管道pipefail增强错误处理
(3)性能优化与并发
  • 短脚本尽量用内建命令,无须频繁启动外部程序
  • 批量任务采用并发(&)、批量wait、调度优化
  • 对于大数据处理用专用工具(awk、sed、xargs)嵌入Shell

6.3 进阶脚本技巧

  • 利用Here Document(<<EOF)写多行文件块
  • 用readarray等批量读取、分割数据
  • getopts实现命令行参数解析与多选项控制

例:

whilegetopts":u:p:"opt;docase$optinu)user="$OPTARG";;p)pass="$OPTARG";;\?)echo"Invalid option -$OPTARG">&2;;esacdone

七、安全性与脚本易错陷阱

7.1 命令注入与危险重定向

  • 严禁用未过滤输入拼接到Shell命令中,防止恶意代码执行
  • 用"$VAR"方式引用变量,避免空格拆分和参数偏移
  • 筛查命令管道出口,防止信息泄露、数据污染

7.2 权限与合规性问题

  • 赋予执行权限要谨慎,chmod +x仅限可信环境
  • 不轻易用sudo执行Shell脚本,权限管理细致分隔

7.3 资源占用与极限异常处理

  • 脚本循环须限制次数防止死循环
  • 并发任务监控处理,避免僵尸进程
  • 清理临时文件、释放句柄,避免资源争抢

八、Shell脚本运行机制的创新与未来发展

8.1 Shell与DevOps、云原生时代融合

  • 集成CI/CD流水线,自动管理大规模系统部署和测试
  • 配合容器化与微服务,作为服务编排和运维元件
  • 融合配置管理工具(Ansible、SaltStack),用Shell脚本嵌入高级自动化场景

8.2 Shell脚本与AI、智能系统关系

  • 智能化命令行助手的底层其实也是Shell脚本扩展
  • 数据处理、自动报告、参数识别,可引入AI模型辅助

8.3 运行机制的现代演化

  • 现代Shell(如Fish、zsh)在运行机制上强化智能补全、错误诊断
  • 图形Shell、嵌入式Shell(如BusyBox),在极简环境强化快速运行与资源调度
  • 远程执行Shell脚本(如SSH、自动分发),对安全和审计机制提出更高要求

8.4 Shell脚本的局限与替代趋势

  • 对复杂业务逻辑建议用Python、Go等更安全、类型强约束的脚本语言
  • Shell脚本将继续作为Glue Language(粘合剂语言)在系统级接口发挥价值

九、Shell脚本运行环节的“可视化”解读(故事与类比)

9.1 “流水线工厂”的形象比喻

你可以把Shell脚本的运行想象为一条工厂流水线:

  • 原料就是脚本文本,每一行是工厂的一道工序
  • Shell是工厂经理,负责一行一行接单、协调工人
  • 工人有两类:本厂自带(内建命令),外包来人(外部程序)
  • 每道工序(命令)可以把半成品(数据流)传递给下一道工序(管道)
  • 工人要处理特殊订单(变量),经理必须检查清楚接收的信息(环境变量)
  • 整个工厂结束后,经理整理报表(出口码),清理现场

这种流程清晰、协作明快,充分体现了Shell脚本的解释性、分步执行业务特性。


十、完整运行例子与分步剖析

以一个典型自动化脚本为例,细分每步原理:

10.1 示例脚本

#!/bin/bashset-euopipefailecho"Start backup..."forfilein$(ls/data/backup/*.db);docp"$file"/data/result/echo"Copied$file"doneecho"Backup finished!"
解剖运行过程
  1. 系统读取shebang,启动bash解释器
  2. bash进程读取文本,设定脚本选项
  3. 执行echo(内建命令),输出提示
  4. 执行ls(外部命令),生成文件列表
  5. 对每个文件循环,cp命令(外部命令)复制文件
  6. 内建echo命令输出进度
  7. 脚本串行执行完毕,回收进程资源、输出“Backup finished!”

每一步Shell都做了“解析—查找—执行—调度—管理—回收”,与操作系统、外部工具无缝协作。


十一、实用资源与进阶学习路线

  • GNU Bash官方文档、man手册
  • Advanced Bash-Scripting Guide(英文/可下载PDF)
  • Linux/UNIX系统编程教材(进程管理、系统调用,理解Shell与内核交互机理)
  • ShellCheck静态代码分析工具
  • Stack Overflow、知乎、B站技术讲解视频等社区
  • GitHub上大量开源Shell脚本实际项目

十二、结语:理解运行机制,提升Shell脚本的极致效率与安全性

Shell脚本的运行,是解读、调度、管理、协作的多重体现。只有真正理解从文本解析、变量替换、命令派发、流程控制、进程管理到资源回收的每一个底层原理,才能在工程实践中快速定位问题、高效编写脚本、避免风险隐患,实现极致自动化和系统集成。

无论你是脚本新手还是资深运维、开发高手,深刻掌握Shell脚本的运行机制,是高质量系统工程的基础、更是未来技术创新的重要利器。

让Shell的每一次运行都秩序井然,让你的工程世界高效自动、如“壳”般坚强!


相关新闻

LFM脉冲压缩雷达仿真:MATLAB完整实现与参数调优指南

LFM脉冲压缩雷达仿真:MATLAB完整实现与参数调优指南

简介&#xff1a;压缩包内提供线性调频&#xff08;LFM&#xff09;脉冲压缩雷达仿真&#xff0c;面向雷达信号处理学习者与Matlab仿真实践者&#xff0c;覆盖从信号生成、回波模拟、匹配滤波到结果分析的主要环节。包内共21个文件&#xff0c;以3个Matlab主脚本和2个备份脚本&…

2026/10/19 18:17:05 阅读更多 →
基于PaddleOCR的中小学试卷手写体识别微调实战

基于PaddleOCR的中小学试卷手写体识别微调实战

开个题&#xff1a;我前前后后接触过不少教育类项目&#xff0c;作业批改、成绩录入、学情分析&#xff0c;大家第一步几乎都卡在同一个地方——试卷上的手写体识别。很多团队一上来就默认“OCR嘛&#xff0c;调用现成API就行”&#xff0c;结果中文手写一测&#xff0c;识别率…

2026/10/19 18:17:05 阅读更多 →
基于YOLOv8的晶圆缺陷检测系统:从传统视觉到深度学习实战

基于YOLOv8的晶圆缺陷检测系统:从传统视觉到深度学习实战

晶圆缺陷检测这个方向&#xff0c;在半导体制造的品质管控里一直是块硬骨头。我最早接触这类需求&#xff0c;是被产线上的人工目检效率逼着入门的——一片晶圆上几百个 Die&#xff0c;靠人眼在显微镜下逐个排查&#xff0c;漏检率不低&#xff0c;而且人员疲劳导致的误判很致…

2026/10/19 18:17:05 阅读更多 →

最新新闻

2026 最新抖音 SEO 推广全攻略,吃透抖音 SEO 视频排名逻辑

2026 最新抖音 SEO 推广全攻略,吃透抖音 SEO 视频排名逻辑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 20:50:01 阅读更多 →
菲涅尔衍射模型解析WiFi呼吸检测:从原理到工程实践

菲涅尔衍射模型解析WiFi呼吸检测:从原理到工程实践

1. 从光学衍射到无线感知&#xff1a;这个项目到底在做什么 菲涅尔衍射和WiFi呼吸检测&#xff0c;乍一看是两个八竿子打不着的领域。一个是光学课本里的经典波动光学内容&#xff0c;一个是近几年火起来的无线感知应用。但把这两个东西放在一起&#xff0c;恰恰说明了一个很有…

2026/10/19 20:48:59 阅读更多 →
西门子1200与FactoryIO机械手仿真:状态机实现虚拟调试全流程

西门子1200与FactoryIO机械手仿真:状态机实现虚拟调试全流程

做工业自动化调试&#xff0c;最怕设备还没到场、程序就得交付&#xff1b;最怕机械没接线、电气没上电&#xff0c;写好的逻辑只能在脑子里跑。我前阵子捣鼓的一套FactoryIO机械手仿真取料程序&#xff0c;算是把这个困局撕开了一个口子&#xff1a;FactoryIO提供虚拟车间&…

2026/10/19 20:48:59 阅读更多 →
图表设计实战指南:从认知到维护的完整方法论

图表设计实战指南:从认知到维护的完整方法论

1. 从"diagram-design"这个标题能读出什么 第一次看到"diagram-design"这个标题&#xff0c;我的直觉是&#xff1a;这大概率不是一个单纯的"画图工具推荐"或者"设计规范文档"&#xff0c;而是一个把 图表设计 这件事当成一个完整工…

2026/10/19 20:46:54 阅读更多 →
图表设计方法论:从沟通逻辑到视觉规范的完整实践指南

图表设计方法论:从沟通逻辑到视觉规范的完整实践指南

1. 图表设计&#xff1a;从“画出来”到“讲清楚”这些年我看了不少技术文档、项目方案和系统说明&#xff0c;发现一个共性问题&#xff1a;大部分人根本不把图表当“设计”来做&#xff0c;而是当“画图”来应付。打开绘图工具&#xff0c;拖几个方框&#xff0c;连几条线&am…

2026/10/19 20:43:51 阅读更多 →
Python+Vue游戏装备交易商城系统:架构设计与实战全解析

Python+Vue游戏装备交易商城系统:架构设计与实战全解析

“基于PythonVue的游戏装备交易商城系统”这个标题&#xff0c;我太熟了。这几乎是每一届想做点东西但又不想只写个管理系统的同学都会碰到的题&#xff0c;也是后台私信里被问得最多的项目类型之一。但说句实话&#xff0c;真正把“交易”两个字做明白的&#xff0c;十个里可能…

2026/10/19 20:42:50 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介&#xff1a;本资源为电源技术方向的学术研究文档&#xff0c;聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略&#xff0c;面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址&#xff1a; https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集&#xff0c;共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →