Windows上运行Linux程序指南:WSL2搭建、示例代码与性能调优
最近有个朋友跟我倒苦水他手头的小项目必须在Linux环境下编译可主力机是Windows每次都得先折腾半天环境。这个场景其实太常见了——很多开源工具链只发布了Linux版本日常脚本依赖Linux的命令行习惯或者部署目标是Linux服务器本地又不想丢掉Windows的办公生态。这篇文章就围绕一件非常具体的事展开如何在Windows上运行Linux程序并附上可以照着敲的示例代码。我会先从需求场景讲起帮你判断该选哪条路线然后把重点放在当前体验最顺、日常使用最频繁的WSL2上从环境搭建、示例代码到文件互操作和性能调优一步步说清楚。文中所有操作和代码我都按“我能直接复现”的标准来写不绕弯子。适合两类人看一类是刚接触跨平台开发、想在Windows里跑Linux工具的新手另一类是已经在用WSL但想解决文件交换、内存占用、端口互通等具体问题的开发者。1. 为什么需要“在Windows上运行Linux程序”先看清需求再选方案1.1 高频典型场景你不是少数人我见过的大多数需求可以归成四类。第一类是工具链依赖比如某个编译器、模拟器或测试框架只提供Linux版Windows下要么没有要么处于半放弃维护的状态。第二类是环境一致性本地开发环境和服务器不一致代码在Windows上好好的部署到Linux就崩你需要在本地先跑一遍Linux环境。第三类是开源程序复现很多论文或开源项目给的示例代码、构建脚本就是面向Linux的在Windows上按步骤走总差那么几步。第四类是运维习惯有些人写自动化脚本就爱用bashPowerShell虽然强大但语法习惯差异不小直接跑Linux脚本更省事。这些场景的共同点是你并不想彻底抛弃Windows只是想借用Linux的能力。想清楚这一点接下来的方案选择才有方向。1.2 程序类型直接决定方案取舍开始之前建议你先问自己需要运行的Linux程序到底是命令行工具还是服务型程序还是有图形界面或者需要直接操作内核这个问题非常关键因为它直接决定了用什么方案。我整理了一张粗略的对应表程序形态推荐方案理由命令行工具、构建脚本、编译器WSL2起步快、资源占用小、和Windows集成好Web服务、数据库、后端进程容器引擎隔离干净、环境可复用现代方案一般也要依赖WSL2做后端图形界面程序虚拟机或新版WSL的图形支持图形渲染需要完整显示栈虚拟机最稳内核模块、自定义驱动虚拟机需要完整Linux内核和设备访问权限这个表格是一个参考不是绝对标准。如果你的需求是“偶尔跑一下Linux命令”那WSL2基本就是最优解如果需求是“完整复现一套Linux服务器环境”那容器或虚拟机更合适。下面我展开对比四条主流路线。2. 四条主流路线对比虚拟机、容器、WSL2与远程开发2.1 虚拟机最完整的Linux但开销也最大虚拟机的思路是在Windows上虚拟出一台完整电脑在里面安装一个完整的Linux系统。它的好处是隔离性最强Linux内核、设备驱动、桌面环境统统都有你想做什么都行几乎和真机没区别。代价也很明显资源开销大、启动慢、平时要维护一个完整的操作系统。一台8GB内存的电脑虚拟机里分上4GB之后Windows这边就会明显紧张。虚拟机的磁盘文件也会占掉几十GB空间日常命令行工作用它有点杀鸡用牛刀的感觉。适合的场景是你需要Linux图形桌面或者需要编译/加载内核模块又或者需要一个完全独立的实验环境。2.2 容器轻量但共享内核服务型程序的好选择容器和虚拟机不一样它不虚拟整套硬件而是共享宿主机内核只做进程和文件系统层面的隔离。因为不需要跑完整操作系统容器启动速度可以做到秒级镜像复用之后部署非常方便。在Windows上跑Linux容器现代方案基本都依赖WSL2作为后端也就是说你先得把WSL2环境搭好。容器的典型使用场景是跑服务型程序比如一个Python后端、一个数据库、一套Web应用。你把依赖、配置、启动命令打包进镜像换一台机器也能得到一致的运行结果。不过容器不适合需要直接操作内核、加载内核模块的程序它的隔离机制决定了那些操作会被拦下来。2.3 WSL2命令行场景的综合最优解WSL2Windows Subsystem for Linux 2是当前Windows上运行Linux程序最实用的一条路线。它的设计思路是把一个精简的Linux内核跑在Windows自带的轻量虚拟化平台上同时保留和Windows高度互通的体验。相比虚拟机WSL2启动只需要一两秒钟内存可以动态回收不会一上来就吃掉固定的大块内存。相比传统翻译层方案WSL2因为用了真正的Linux内核兼容性更好绝大多数Linux二进制程序都能直接跑。再加上它和Windows文件系统、命令行的深度集成日常写代码、跑脚本、做测试都非常顺手。这也是后文示例代码选择WSL2作为主线的原因。2.4 远程开发与交叉编译不一定要在本地跑Linux如果你的目标只是“在Windows上编写和调试Linux程序”其实还有一个轻量思路代码放在Windows本地用一个支持远程开发的编辑器连到一台Linux机器上在远程执行所有编译和运行命令。本地只负责写代码和看输出这种感觉也近似于“在Windows上运行Linux程序”。这种方式适合你已经有一台可用的Linux服务器或开发机。另一种情况是交叉编译直接在Windows上编译出Linux可执行文件。理论上可行但Linux程序依赖动态库、链接器、系统调用交叉编译工具链很容易在依赖上卡脖子。除非是写完全静态的简单程序否则日常使用我还是更推荐WSL2或远程开发省心太多。3. 搭建WSL2环境从打开终端到第一个能跑的程序3.1 前置条件与版本确认安装WSL2之前先确认三件事。第一Windows版本够不够新建议在Windows 10的2004版本以上或者直接用Windows 11这样能享受到最新的WSL改进。第二主板BIOS里要开启虚拟化支持大部分现代电脑默认开启如果你是老机器或者自定义装机需要进BIOS确认一下。第三终端要以管理员权限打开。确认方式很简单在PowerShell里运行wsl --status如果提示找不到命令说明你的Windows版本比较旧如果能看到版本状态说明已经具备基础条件。3.2 一条命令完成安装在较新的Windows版本上安装WSL2已经收敛为一条命令在管理员终端里执行wsl --install这条命令会自动完成几件事启用运行WSL所需的Windows组件、下载并部署一个默认的Linux发行版、把默认版本设置为WSL2。执行完之后按提示重启电脑重启后系统会进入发行版的初始化流程让你创建一个Linux用户名和密码之后就进入了Linux环境。如果你想自己指定发行版可以先查看在线可用的列表wsl --list --online然后安装指定的发行版wsl --install -d 发行版名称安装完成后随时可以打开新的终端窗口输入wsl直接进入默认的Linux环境。3.3 首次配置与基础工具安装进入Linux环境后我建议先做三件事算是环境初始化的“三件套”。第一确认内核和系统信息uname -a看到一串包含WSL2字样的Linux内核信息就说明环境正常。第二更新软件源和基础软件包主流的发行版一般用sudo apt update sudo apt upgrade -y这个过程会把软件索引刷新并升级已安装的包。第三安装编译和运行示例代码要用到的工具sudo apt install -y build-essential python3 python3-pipbuild-essential带了gcc、g、make这些编译基础工具Python环境也一并装上。3.4 WSL1与WSL2两代架构的区别安装命令默认会使用WSL2架构但有些老环境可能还是WSL1。WSL1没有虚拟机的内核而是通过翻译层把Linux系统调用转成Windows调用优点是启动极快、跨文件系统访问原生一些缺点是有些程序对系统调用支持不完整会有兼容性问题。WSL2则用轻量虚拟机承载真正的Linux内核兼容性大幅提升是目前的主流。如果你的发行版还在WSL1想切换到WSL2可以执行wsl --set-version 发行版名称 2一般情况我都会建议用WSL2除非你有特别依赖WSL1文件系统语义的边缘场景。4. 附示例代码三种语言与一个网络服务的完整演示4.1 C语言程序编译工具链正确性的试金石进入WSL后随便建一个目录写一个C程序。用nano、vim或者直接在Windows侧用编辑器写完放到WSL里都行。创建hello.c#include stdio.h int main(void) { printf(Hello from Linux, running on Windows!\n); return 0; }用gcc编译gcc hello.c -o hello ./hello输出会是Hello from Linux, running on Windows!为什么这里要写./hello而不是直接写hello因为Linux默认不把当前目录加入可执行文件的搜索路径直接输入hello会让shell去PATH目录里找通常找不到。养成用./的习惯后续执行脚本和程序都会少很多困惑。4.2 Python脚本Windows兼容性问题的一个典型Python本身是跨平台的但很多科学计算、数据处理相关的库在Windows上的二进制分发并不完整或者行为有细微差异。在WSL里跑Linux版Python会更接近生产环境。创建一个fib.pydef fib(n): a, b 0, 1 for _ in range(n): a, b b, a b return a for i in range(10): print(ffib({i}) {fib(i)})执行python3 fib.py输出Fibonacci数列的前十项。这个例子很小但它验证了Python解释器、脚本执行权限、输出编码等基础链路都没问题。后续你安装第三方库比如用pip install安装某个只提供Linux轮子的包在WSL里会顺利很多。4.3 Shell脚本处理批量重命名和文本操作Shell脚本是Linux环境下的高频需求。下面这个脚本把当前目录下所有.txt文件重命名为.bak后缀#!/bin/bash for file in *.txt; do [ -e $file ] || continue mv $file ${file%.txt}.bak done先把内容保存为rename.sh然后赋予执行权限chmod x rename.sh ./rename.sh其中chmod x是给脚本添加可执行权限。如果你是从Windows侧拷贝这个文件到WSL里可能会遇到换行符问题导致脚本报\r: command not found。这个问题我在下一章详细讲。4.4 网络服务在Windows浏览器中访问WSL里的程序WSL2有一个很实用的特性WSL里监听的端口Windows通常可以直接通过localhost访问。我经常用这个方式快速启动一个本地服务来验证代码。在WSL里启动一个简单的HTTP服务cd /home/你的用户名 python3 -m http.server 8000然后打开Windows浏览器访问http://localhost:8000你就能看到那个目录的文件列表。这说明Linux程序在WSL里跑起来之后网络链路和Windows是通的。如果访问不到一般是WSL版本较旧或者端口转发被关闭可以先用ip addr查看WSL的IP然后用http://WSL-IP:8000尝试不过新版默认情况下localhost转发已经很好用了。5. 文件系统互操作与文本编码最常见的小麻烦5.1 两套文件系统两条访问路径WSL2里其实存在两套文件系统。一套是Linux自己的ext4文件系统固定在WSL的虚拟磁盘里性能好是存放代码和工作文件的首选位置。另一套是Windows文件系统的挂载点所有Windows盘符都在Linux环境下以/mnt/盘符的形式出现比如C盘就是/mnt/c。在Linux里访问Windows文件cd /mnt/c/Users/你的用户名/Desktop ls -l在Windows里访问WSL文件可以在资源管理器的地址栏输入\\wsl$或者\\wsl$\发行版名称\home\你的用户名这样Windows侧的程序也能直接读写WSL里的文件两边互通很方便。5.2 使用wslpath转换路径路径格式不同常常让人头晕好在WSL提供了一个专门的转换命令wslpath。在WSL里执行wslpath C:\Users\你的用户名\Desktop\file.txt会输出对应的Linux路径/mnt/c/Users/你的用户名/Desktop/file.txt反向转换用-w参数wslpath -w /home/你的用户名/file.txt这个命令在写脚本时特别有用可以把Windows路径作为参数传给Linux程序。5.3 CRLF、LF与可执行权限Windows上的文本文件默认用回车换行CRLFLinux则只用换行LF。当你把一个Windows编辑器保存的脚本拷贝进WSL直接执行经常会出现一个诡异报错bash: script.sh: /bin/bash^M: bad interpreter。处理办法很简单把回车符去掉sed -i s/\r$// script.sh执行完再试脚本就能正常运行了。如果这个项目用了Git建议在Windows侧配置一下core.autocrlf让Git在检出时自动转换换行符能从源头减少这类问题。另外从Windows复制到WSL里的文件默认可能没有Linux可执行权限所以chmod x script.sh这步不要省略。中文内容方面大部分现代发行版默认UTF-8编码和Windows下的新编辑器一致如果你要处理旧版GBK编码的文件可以用iconv先做转码。6. 踩坑记录与性能调优让程序稳定运行磁盘和内存不失控6.1 端口互通的两个小坑虽然WSL2的localhost转发很方便但偶尔也会遇到失效的情况。常见原因有两个一是WSL版本太旧内核没有启用对应的转发机制二是服务启动时监听在某个特定IP上而不是0.0.0.0。比如Python的http.server默认监听所有接口一般没问题但某些服务默认只监听127.0.0.1Windows侧访问时可能就切换不到。排查思路是先在WSL里确认监听地址ss -tlnp | grep 8000如果看到的是127.0.0.1:8000就要到服务的配置里改成0.0.0.0。Windows防火墙第一次拦截WSL进程的入站连接时会弹窗询问记得允许否则外部程序访问WSL端口也会不通。6.2 用.wslconfig限制内存与CPUWSL2默认的内存管理是动态增长但它有个特点最多可能占用Windows一半的物理内存。如果电脑内存不大跑几个Linux程序之后Windows会明显变卡。这里可以用.wslconfig文件做限制。在Windows侧创建或编辑C:\Users\你的用户名\.wslconfig[wsl2] memory4GB processors4 swap2GB保存之后在PowerShell里执行wsl --shutdown再重新打开WSL配置就会生效。注意这个文件是Windows侧的不是Linux侧。很多人在Linux里到处找这个文件找不到就是这个原因。6.3 虚拟磁盘只增不减WSL2的Linux文件系统存放在一个虚拟磁盘文件里这个文件会随着使用不断增大但删除文件之后它不一定会自动还给宿主机导致Windows侧看到磁盘占用一直涨。解决办法是压缩虚拟磁盘。流程大致是先备份重要数据然后在PowerShell里执行wsl --shutdown再用Windows自带的磁盘管理工具找到WSL的虚拟磁盘文件进行压缩。具体工具名称不同版本略有差异操作前务必确认备份完整。这属于低频维护操作我一般两三个月做一次做完能让磁盘占用明显回落。6.4 启用systemd以支持后台服务新版WSL2已经支持systemd这对跑后台服务很重要。默认情况下有些发行版没有开启systemd你执行systemctl start xxx会报错说没有连上systemd。开启方式很简单编辑WSL里的/etc/wsl.conf[boot] systemdtrue保存后回到Windows侧执行wsl --shutdown再重新进入WSL执行systemctl status确认systemd已经运行。之后就能用systemctl管理Linux服务了比如开机自启某些程序或者运行数据库服务。6.5 双向调用Windows命令与Linux命令互相使用WSL一个很实用的点是双向互操作。在Windows的PowerShell或CMD里可以直接调用Linux命令wsl bash -c ls -l /etc/passwd在WSL里也可以调用Windows程序。比如想用Windows记事本打开WSL里的一个文本文件/mnt/c/Windows/System32/notepad.exe log.txt这会直接唤起Windows记事本并在里面打开Linux侧的文件。对于那些“Windows有现成工具、Linux侧没有”的场景这个能力非常方便。建议你把WSL的路径挂在终端里随时双向跳转。结尾我的日常使用习惯最后分享一点个人经验。我现在的习惯是所有和开发相关的文件一律放在WSL的Linux文件系统里Windows侧编辑器通过\\wsl$路径去访问只有在需要把产物交给Windows工具链时才复制到/mnt/c下面。这样做的好处是避开了跨文件系统IO性能损耗Git关联文件也不会被奇怪的换行符问题反复纠缠。每次新建一个WSL环境我总会先做三件事更新软件索引、安装build-essential、把所有脚本文件统一转成LF换行。这套流程走下来基本没有遇到过环境导致的诡异问题。如果你打算长期在Windows上运行Linux程序我建议你也把这套流程固化下来省下的时间远比研究各种临时方案多得多。

相关新闻

rp-engine变量绑定深度解析:5种绑定语法与死路径检测,根治条件分支收敛难题

rp-engine变量绑定深度解析:5种绑定语法与死路径检测,根治条件分支收敛难题

【免费下载链接】rp-engine YAML-native agent workflow execution engine, written in Rust 项目地址: https://gitcode.com/gh_mirrors/rp/rp-engine 点击查看 免费下载 rp-engine 是一个用 Rust 编写的 YAML 原生 Agent 工作流执行引擎。本文拆解它的变量绑定&a…

2026/10/14 17:13:38 阅读更多 →
数据产品商业合作模式全解析:从API计费到联合运营的落地指南

数据产品商业合作模式全解析:从API计费到联合运营的落地指南

做数据产品这行,被问到最多的一个问题往往不是技术怎么做,而是“我们的数据产品到底该怎么跟别人合作”。很多团队技术能力很强,模型跑得通、平台也搭得起来,但一到商务层面就卡壳:是按调用量收费还是按年订阅&#xf…

2026/10/14 17:13:38 阅读更多 →
STM32自制函数信号发生器:DAC+DMA+定时器波形输出实战

STM32自制函数信号发生器:DAC+DMA+定时器波形输出实战

简介:基于STM32的函数信号发生器完整工程包,面向嵌入式开发学习者,演示如何借助STM32内置DAC生成方波、三角波与正弦波,并利用DMA把波形数据快速搬运到DAC寄存器,实现无需CPU全程参与的高效连续输出。项目通过按键中断…

2026/10/14 17:13:38 阅读更多 →

最新新闻

数据库与缓存实战指南:从MySQL索引到Redis穿透与雪崩

数据库与缓存实战指南:从MySQL索引到Redis穿透与雪崩

得,直接开始正题。聊到互联网后端,我估计前面两篇已经把HTTP协议、Web框架、接口设计这些基础盘得差不多了,这篇咱们必须得换个频道,聊聊在“学习记录”这个系列里最劝退、也最躲不开的硬骨头——数据库与缓存。你去看各大招聘网站…

2026/10/14 18:00:22 阅读更多 →
aiogram 入门实战:用完全异步的 Python 框架快速构建 Telegram Bot

aiogram 入门实战:用完全异步的 Python 框架快速构建 Telegram Bot

后端即时通讯API设计 【免费下载链接】aiogram aiogram is a modern and fully asynchronous framework for Telegram Bot API written in Python using asyncio 项目地址: https://gitcode.com/gh_mirrors/ai/aiogram 点击查看 免费下载 aiogram 是一个基于 Pytho…

2026/10/14 18:00:22 阅读更多 →
高项论文质量管理写作指南:从过程组到工具用法的落地拆解

高项论文质量管理写作指南:从过程组到工具用法的落地拆解

每年软考成绩出来之后,评论区里最热闹的往往是论文。尤其是“论项目的质量管理”这个题目,经常出现在备选列表里,也年年有大把考生栽在它上面。按理说,质量管理是项目管理者最不陌生的领域:开发要做测试、交付要有验收…

2026/10/14 18:00:22 阅读更多 →
HarmonyOS 6.0+分布式App开发实战:跨端协同与设备重组

HarmonyOS 6.0+分布式App开发实战:跨端协同与设备重组

1. 跨端开发不是在“移植”,是在“重组”做了几年的多端应用,我越来越觉得“跨端”这个词被理解得太浅了。很多人以为跨端就是把手机上的页面缩一缩放到平板上,或者把App打包成能够在不同系统上跑一遍的安装包。但实际上,真正的跨…

2026/10/14 18:00:22 阅读更多 →
IT培训行业技术管理者的职业发展路径解析

IT培训行业技术管理者的职业发展路径解析

1. 项目背景解析这个标题看似夸张,实则反映了一个职场人从基层逆袭到高管的成长故事。作为在黑马程序员广州校区工作多年的老员工,我亲眼见证过不少技术人通过自身努力实现职业跃迁的真实案例。今天我们就来拆解一个技术管理者从校区基层做到集团高管的典…

2026/10/14 18:00:22 阅读更多 →
C#与松下PLC通信:Mewtocol协议串口/以太网例程与避坑指南

C#与松下PLC通信:Mewtocol协议串口/以太网例程与避坑指南

简介:面向工业自动化上位机开发者的C#与松下PLC通信完整示例工程,以手机屏幕异物检测为应用场景,演示通过串口、TCP/IP等方式与PLC交互,完成数据采集与指令下发。资源包共113个文件,以C#源码(.cs)为主,另有…

2026/10/14 17:59:21 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →