[{"data":1,"prerenderedAt":8993},["ShallowReactive",2],{"home-latest-posts":3,"sidebar-page":582},[4,65,594,1048,3354],{"id":5,"title":6,"author":7,"body":10,"cover":52,"date":53,"description":54,"extension":55,"meta":56,"navigation":57,"path":58,"seo":59,"stem":60,"tags":61,"__hash__":64},"content\u002Ftest.md","这是一篇测试文章",[8,9],"AeYunDian","aaa",{"type":11,"value":12,"toc":47},"minimark",[13,22,27,31,41],[14,15,16,17,21],"p",{},"这是文章的正文内容，",[18,19,20],"strong",{},"支持完整的 Markdown 语法","。",[23,24,26],"h1",{"id":25},"_111","111",[28,29,30],"h2",{"id":30},"二级标题测试",[32,33,34,38],"ul",{},[35,36,37],"li",{},"列表项 1",[35,39,40],{},"列表项 2",[42,43,44],"blockquote",{},[14,45,46],{},"这是一段引用。",{"title":48,"searchDepth":49,"depth":49,"links":50},"",2,[51],{"id":30,"depth":49,"text":30},"https:\u002F\u002Fcn.bing.com\u002Fth?id=OHR.BubblesAbraham_ZH-CN7203734882_UHD.jpg&pid=hp&w=1920","2026-11-14 22:25","这是文章的正文内容，支持完整的 Markdown 语法。","md",{},true,"\u002Ftest",{"title":6,"description":54},"test",[62,63],"1","2","ClhEGBAZ4rpnB2R8jEjH4d5WkqNl1HEfKoXBUr79Ins",{"id":66,"title":67,"author":8,"body":68,"cover":582,"date":583,"description":584,"extension":55,"meta":585,"navigation":57,"path":586,"seo":587,"stem":588,"tags":589,"__hash__":593},"content\u002Fmarkdown-nunjucks-usage-2026-09-18.md","关于在 Markdown 中嵌入 Nunjucks 组件的说明",{"type":11,"value":69,"toc":573},[70,78,82,85,88,115,118,121,125,128,130,150,152,159,162,165,169,172,174,206,208,211,218,222,225,227,246,248,251,254,260,263,265,284,286,289,294,298,309,311,353,355,477,481,492,499,501,516,518,535,542,549,563,567,570],[14,71,72,73,77],{},"本站的 ",[74,75,76],"code",{},".md"," 文件由 Eleventy 的 Nunjucks 引擎在构建时编译。正文中的 Nunjucks 模板语法会被解析执行，组件以 macro 的形式调用。现将使用方法说明如下。",[28,79,81],{"id":80},"一基本用法","一、基本用法",[14,83,84],{},"在 frontmatter 之后，正文中直接书写 Nunjucks 语法即可。使用组件前，需要先从组件文件导入对应的 macro：",[14,86,87],{},"{% raw %}",[89,90,94],"pre",{"className":91,"code":92,"language":93,"meta":48,"style":48},"language-njk shiki shiki-themes monokai","{% from \"components\u002Fbutton.njk\" import button %}\n\n{{ button({ text: \"阅读全文\", href: \"\u002Fposts\u002Fhello\u002F\", type: \"primary\" }) }}\n","njk",[74,95,96,104,109],{"__ignoreMap":48},[97,98,101],"span",{"class":99,"line":100},"line",1,[97,102,103],{},"{% from \"components\u002Fbutton.njk\" import button %}\n",[97,105,106],{"class":99,"line":49},[97,107,108],{"emptyLinePlaceholder":57},"\n",[97,110,112],{"class":99,"line":111},3,[97,113,114],{},"{{ button({ text: \"阅读全文\", href: \"\u002Fposts\u002Fhello\u002F\", type: \"primary\" }) }}\n",[14,116,117],{},"{% endraw %}",[14,119,120],{},"渲染结果是一个带样式的按钮链接。正文中的 Nunjucks 语法与 Markdown 可以混用，不会相互干扰。",[28,122,124],{"id":123},"二条件渲染","二、条件渲染",[14,126,127],{},"Nunjucks 的 if 标签用于根据 frontmatter 或站点数据决定是否输出某段内容。",[14,129,87],{},[89,131,133],{"className":91,"code":132,"language":93,"meta":48,"style":48},"{% if description %}\n\u003Cp>本文摘要：{{ description }}\u003C\u002Fp>\n{% endif %}\n",[74,134,135,140,145],{"__ignoreMap":48},[97,136,137],{"class":99,"line":100},[97,138,139],{},"{% if description %}\n",[97,141,142],{"class":99,"line":49},[97,143,144],{},"\u003Cp>本文摘要：{{ description }}\u003C\u002Fp>\n",[97,146,147],{"class":99,"line":111},[97,148,149],{},"{% endif %}\n",[14,151,117],{},[14,153,154,155,158],{},"实际效果：本页的 ",[74,156,157],{},"description"," 有值，所以下面的摘要会显示出来。",[14,160,161],{},"{% if description %}",[14,163,164],{},"本文摘要：{{ description }}",[28,166,168],{"id":167},"三循环渲染","三、循环渲染",[14,170,171],{},"for 标签用于遍历数组，比如站点导航、文章标签。",[14,173,87],{},[89,175,177],{"className":91,"code":176,"language":93,"meta":48,"style":48},"\u003Cul>\n{% for item in site.navigation %}\n  \u003Cli>\u003Ca href=\"{{ item.url }}\">{{ ui.nav[item.key] }}\u003C\u002Fa>\u003C\u002Fli>\n{% endfor %}\n\u003C\u002Ful>\n",[74,178,179,184,189,194,200],{"__ignoreMap":48},[97,180,181],{"class":99,"line":100},[97,182,183],{},"\u003Cul>\n",[97,185,186],{"class":99,"line":49},[97,187,188],{},"{% for item in site.navigation %}\n",[97,190,191],{"class":99,"line":111},[97,192,193],{},"  \u003Cli>\u003Ca href=\"{{ item.url }}\">{{ ui.nav[item.key] }}\u003C\u002Fa>\u003C\u002Fli>\n",[97,195,197],{"class":99,"line":196},4,[97,198,199],{},"{% endfor %}\n",[97,201,203],{"class":99,"line":202},5,[97,204,205],{},"\u003C\u002Ful>\n",[14,207,117],{},[14,209,210],{},"输出为：",[89,212,216],{"className":213,"code":176,"language":215},[214],"language-text","text",[74,217,176],{"__ignoreMap":48},[28,219,221],{"id":220},"四嵌入组件","四、嵌入组件",[14,223,224],{},"本站提供的组件均可在正文中直接调用。先导入，再调用：",[14,226,87],{},[89,228,230],{"className":91,"code":229,"language":93,"meta":48,"style":48},"{% from \"components\u002Falert.njk\" import alert %}\n\n{{ alert({ type: \"info\", title: \"提示\", content: \"这是一条信息。\" }) }}\n",[74,231,232,237,241],{"__ignoreMap":48},[97,233,234],{"class":99,"line":100},[97,235,236],{},"{% from \"components\u002Falert.njk\" import alert %}\n",[97,238,239],{"class":99,"line":49},[97,240,108],{"emptyLinePlaceholder":57},[97,242,243],{"class":99,"line":111},[97,244,245],{},"{{ alert({ type: \"info\", title: \"提示\", content: \"这是一条信息。\" }) }}\n",[14,247,117],{},[14,249,250],{},"实际渲染效果：",[14,252,253],{},"{% from \"components\u002Falert.njk\" import alert %}",[14,255,256],{},[257,258],"binding",{"value":259},"alert({ type: \"info\", title: \"提示\", content: \"这是一条信息。\" })",[14,261,262],{},"标签组件同理：",[14,264,87],{},[89,266,268],{"className":91,"code":267,"language":93,"meta":48,"style":48},"{% from \"components\u002Ftag.njk\" import tag %}\n\n{{ tag({ text: \"Eleventy\", href: \"\u002Ftags\u002Feleventy\u002F\", color: \"default\" }) }}\n",[74,269,270,275,279],{"__ignoreMap":48},[97,271,272],{"class":99,"line":100},[97,273,274],{},"{% from \"components\u002Ftag.njk\" import tag %}\n",[97,276,277],{"class":99,"line":49},[97,278,108],{"emptyLinePlaceholder":57},[97,280,281],{"class":99,"line":111},[97,282,283],{},"{{ tag({ text: \"Eleventy\", href: \"\u002Ftags\u002Feleventy\u002F\", color: \"default\" }) }}\n",[14,285,117],{},[14,287,288],{},"{% from \"components\u002Ftag.njk\" import tag %}",[14,290,291],{},[257,292],{"value":293},"tag({ text: \"Eleventy\", href: \"\u002Ftags\u002Feleventy\u002F\", color: \"default\" })",[28,295,297],{"id":296},"五组件参数","五、组件参数",[14,299,300,301,304,305,308],{},"所有组件都以",[18,302,303],{},"字典","形式传参，可选的键取决于组件定义。以 ",[74,306,307],{},"button"," 为例：",[14,310,87],{},[89,312,314],{"className":91,"code":313,"language":93,"meta":48,"style":48},"{{ button({\n  text: \"提交\",\n  type: \"primary\",\n  size: \"lg\",\n  block: true,\n  disabled: false\n}) }}\n",[74,315,316,321,326,331,336,341,347],{"__ignoreMap":48},[97,317,318],{"class":99,"line":100},[97,319,320],{},"{{ button({\n",[97,322,323],{"class":99,"line":49},[97,324,325],{},"  text: \"提交\",\n",[97,327,328],{"class":99,"line":111},[97,329,330],{},"  type: \"primary\",\n",[97,332,333],{"class":99,"line":196},[97,334,335],{},"  size: \"lg\",\n",[97,337,338],{"class":99,"line":202},[97,339,340],{},"  block: true,\n",[97,342,344],{"class":99,"line":343},6,[97,345,346],{},"  disabled: false\n",[97,348,350],{"class":99,"line":349},7,[97,351,352],{},"}) }}\n",[14,354,117],{},[356,357,358,374],"table",{},[359,360,361],"thead",{},[362,363,364,368,371],"tr",{},[365,366,367],"th",{},"参数",[365,369,370],{},"类型",[365,372,373],{},"说明",[375,376,377,390,409,433,452,465],"tbody",{},[362,378,379,384,387],{},[380,381,382],"td",{},[74,383,215],{},[380,385,386],{},"string",[380,388,389],{},"按钮文字",[362,391,392,397,399],{},[380,393,394],{},[74,395,396],{},"href",[380,398,386],{},[380,400,401,402,405,406],{},"有值时渲染为 ",[74,403,404],{},"\u003Ca>","，否则为 ",[74,407,408],{},"\u003Cbutton>",[362,410,411,416,418],{},[380,412,413],{},[74,414,415],{},"type",[380,417,386],{},[380,419,420,423,424,423,427,423,430],{},[74,421,422],{},"primary"," \u002F ",[74,425,426],{},"secondary",[74,428,429],{},"success",[74,431,432],{},"danger",[362,434,435,440,442],{},[380,436,437],{},[74,438,439],{},"size",[380,441,386],{},[380,443,444,423,447,423,449],{},[74,445,446],{},"sm",[74,448,55],{},[74,450,451],{},"lg",[362,453,454,459,462],{},[380,455,456],{},[74,457,458],{},"block",[380,460,461],{},"boolean",[380,463,464],{},"是否占满整行",[362,466,467,472,474],{},[380,468,469],{},[74,470,471],{},"disabled",[380,473,461],{},[380,475,476],{},"是否禁用",[28,478,480],{"id":479},"六注意事项","六、注意事项",[14,482,483,484,487,488,491],{},"（一）",[18,485,486],{},"组件需要显式导入","。Nunjucks 的 macro 不像 Vue 组件那样自动注册，必须在文章里用 ",[74,489,490],{},"from ... import ..."," 后再调用。",[14,493,494,495,498],{},"（二）",[18,496,497],{},"字典里不能嵌套双花括号","。以下写法是错的——字典内部不能再写模板表达式，需要先 set 再引用：",[14,500,87],{},[89,502,504],{"className":91,"code":503,"language":93,"meta":48,"style":48},"{% set href = \"\u002Ftags\u002F\" + (t | tagSlug) + \"\u002F\" %}\n{{ tag({ text: t, href: href }) }}\n",[74,505,506,511],{"__ignoreMap":48},[97,507,508],{"class":99,"line":100},[97,509,510],{},"{% set href = \"\u002Ftags\u002F\" + (t | tagSlug) + \"\u002F\" %}\n",[97,512,513],{"class":99,"line":49},[97,514,515],{},"{{ tag({ text: t, href: href }) }}\n",[14,517,117],{},[14,519,520,521,524,525,528,529,531,532,21],{},"（三）",[18,522,523],{},"Markdown 里的 shell 语法可能被误解析","。Nunjucks 会把花括号加井号当作注释开始标记，shell 脚本里取字符串长度的那种写法会触发 ",[74,526,527],{},"expected end of comment"," 错误。解决办法是用 ",[74,530,87],{}," 包裹那一行，或者改用等价的 shell 命令，例如 ",[74,533,534],{},"expr length \"$str\"",[14,536,537,538,541],{},"（四）",[18,539,540],{},"构建时编译","。正文中的 Nunjucks 在构建阶段执行，输出纯 HTML。若 macro 名或参数拼写错误，会在构建时报错，而不是静默忽略。",[14,543,544,545,548],{},"（五）",[18,546,547],{},"没有运行时状态","。本站是静态站点，正文里不存在 Vue 那样的响应式状态。需要交互（比如切换显示）时，要借助 jQuery 或原生 JS，且只在现代浏览器中执行，IE7 只保证静态内容的可读性。",[14,550,551,552,555,556,559,560,21],{},"（六）",[18,553,554],{},"不要写 style 块","。文章内的样式用已有 CSS 类或内联 ",[74,557,558],{},"style"," 属性，不推荐在 Markdown 里写 ",[74,561,562],{},"\u003Cstyle>",[28,564,566],{"id":565},"七小结","七、小结",[14,568,569],{},"Markdown 与 Nunjucks 的融合让静态内容具备了组件化能力。文章可以引用全局数据、复用 UI 组件、按条件或循环渲染结构化内容，同时保持构建产物是纯静态 HTML，兼容到 IE7。这使得一批需要在多篇文章里重复出现的结构，可以被抽成组件统一维护。",[558,571,572],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":48,"searchDepth":49,"depth":49,"links":574},[575,576,577,578,579,580,581],{"id":80,"depth":49,"text":81},{"id":123,"depth":49,"text":124},{"id":167,"depth":49,"text":168},{"id":220,"depth":49,"text":221},{"id":296,"depth":49,"text":297},{"id":479,"depth":49,"text":480},{"id":565,"depth":49,"text":566},null,"2026-10-03","本站 Markdown 文件由 Nunjucks 编译，正文中可直接调用组件 macro、条件渲染与循环。",{},"\u002Fmarkdown-nunjucks-usage-2026-09-18",{"title":67,"description":584},"markdown-nunjucks-usage-2026-09-18",[590,591,592],"Nunjucks","Markdown","Eleventy","MdUbcFEW1qf-NzpeyZmkI2XJI4m6X-6wIMK7c9vGCSs",{"id":595,"title":596,"author":8,"body":597,"cover":582,"date":583,"description":601,"extension":55,"meta":1039,"navigation":57,"path":1040,"seo":1041,"stem":1042,"tags":1043,"__hash__":1047},"content\u002Fsite-migration-compliance-2026-10-03.md","关于本站开展技术架构迁移的说明",{"type":11,"value":598,"toc":1032},[599,602,606,612,626,632,638,641,645,651,665,683,685,721,723,726,728,737,739,742,752,786,793,799,813,816,822,855,858,864,888,895,899,905,911,917,923,929,933,936,939,945,948,952,955,958,961,966,1000,1005,1029],[14,600,601],{},"为进一步降低站点运行成本、提升内容可维护性、扩大浏览器兼容范围，本站于2026年9月至10月对底层技术架构进行系统性迁移。本次迁移不涉及内容层与视觉层的整体改版，但涉及渲染方式、组件体系、样式组织、URL 规范、构建流程等基础机制的全面调整。现将迁移背景、主要内容及后续安排说明如下。",[28,603,605],{"id":604},"一迁移背景","一、迁移背景",[14,607,483,608,611],{},[18,609,610],{},"原架构的局限","。本站原采用 Vue 3 单页应用方案，构建产物依赖客户端 JavaScript 渲染。该方案在交互密集的应用中具有优势，但对以内容发布为主要目的的站点而言存在以下局限：",[32,613,614,617,620,623],{},[35,615,616],{},"首屏渲染依赖脚本执行，禁用脚本的浏览器无法获取内容；",[35,618,619],{},"对早期浏览器（如 Internet Explorer 系列）兼容成本极高；",[35,621,622],{},"内容以组件形式组织，写作需要掌握 Vue 模板语法，创作门槛较高；",[35,624,625],{},"每次内容更新均需重新打包全量资源，发布流程偏重。",[14,627,494,628,631],{},[18,629,630],{},"本站定位的变化","。随着本站内容以\"备忘录\"\"规范说明\"\"公告\"等长文为主，交互需求趋弱，静态内容发布需求趋强。原架构与站点定位之间的适配度下降。",[14,633,520,634,637],{},[18,635,636],{},"兼容性要求","。本站明确将浏览器兼容范围扩展至 Internet Explorer 7 及以上的所有浏览器，原架构基于现代 JavaScript 特性，无法覆盖该范围。",[14,639,640],{},"基于以上三点，本站决定对技术架构进行调整。",[28,642,644],{"id":643},"二迁移主要内容","二、迁移主要内容",[14,646,483,647,650],{},[18,648,649],{},"构建体系迁移","。由 Vue 3 + Vite 方案调整为 Eleventy 3 + Nunjucks 方案。Eleventy 为静态站点生成器，在构建阶段完成全部页面渲染，输出纯 HTML、CSS 与少量辅助脚本。迁移后：",[32,652,653,656,659,662],{},[35,654,655],{},"所有页面均为预渲染的静态 HTML；",[35,657,658],{},"站点可部署于任意静态托管服务；",[35,660,661],{},"构建产物不含应用级 JavaScript 框架代码；",[35,663,664],{},"内容更新仅重新生成对应页面。",[14,666,494,667,670,671,674,675,678,679,682],{},[18,668,669],{},"组件体系迁移","。由 Vue 单文件组件调整为 Nunjucks macro。原 ",[74,672,673],{},".vue"," 文件中以 ",[74,676,677],{},"props"," 传参、以 ",[74,680,681],{},"slot"," 分发内容的方式，统一改为 Nunjucks 的宏调用，参数以字典形式传入。以按钮组件为例，原写法为：",[14,684,87],{},[89,686,690],{"className":687,"code":688,"language":689,"meta":48,"style":48},"language-vue shiki shiki-themes monokai","\u003CGovButton variant=\"primary\">提交\u003C\u002FGovButton>\n","vue",[74,691,692],{"__ignoreMap":48},[97,693,694,698,702,706,709,713,716,718],{"class":99,"line":100},[97,695,697],{"class":696},"sCdxs","\u003C",[97,699,701],{"class":700},"s8I7P","GovButton",[97,703,705],{"class":704},"sHkqI"," variant",[97,707,708],{"class":696},"=",[97,710,712],{"class":711},"s_Ekj","\"primary\"",[97,714,715],{"class":696},">提交\u003C\u002F",[97,717,701],{"class":700},[97,719,720],{"class":696},">\n",[14,722,117],{},[14,724,725],{},"迁移后写法为：",[14,727,87],{},[89,729,731],{"className":91,"code":730,"language":93,"meta":48,"style":48},"{{ button({ text: \"提交\", type: \"primary\" }) }}\n",[74,732,733],{"__ignoreMap":48},[97,734,735],{"class":99,"line":100},[97,736,730],{},[14,738,117],{},[14,740,741],{},"两种方式在职责上等价：均实现\"一处定义、多处引用\"。差异在于前者运行于客户端，后者运行于构建时。",[14,743,520,744,747,748,751],{},[18,745,746],{},"样式体系重组","。原样式以 Vue 单文件组件内的 ",[74,749,750],{},"\u003Cstyle scoped>"," 形式就近维护，存在重复定义、难以全局复用的问题。本次调整将样式按用途分为三类：",[32,753,754,760,774],{},[35,755,756,759],{},[18,757,758],{},"基础样式","：重置、变量、布局，全站始终加载；",[35,761,762,765,766,769,770,773],{},[18,763,764],{},"组件样式","：按组件粒度拆分独立文件，如 ",[74,767,768],{},"button.css","、",[74,771,772],{},"tag.css","；",[35,775,776,779,780,769,783,21],{},[18,777,778],{},"页面样式","：按页面粒度独立维护，如 ",[74,781,782],{},"post.css",[74,784,785],{},"archive.css",[14,787,788,789,792],{},"每个页面在 frontmatter 中声明所需样式文件，构建时按需拼装 ",[74,790,791],{},"\u003Clink>"," 标签，避免全站加载无关样式。",[14,794,537,795,798],{},[18,796,797],{},"URL 规范调整","。原标签页 URL 使用原始中文字符，存在编码歧义、跨平台兼容性差的问题。本次调整引入拼音转换规则，将中文标签统一转换为带声调数字的拼音形式，例如：",[32,800,801,807],{},[35,802,803,804],{},"原 URL：",[74,805,806],{},"\u002Ftags\u002F文章\u002F",[35,808,809,810],{},"新 URL：",[74,811,812],{},"\u002Ftags\u002Fwen2-zhang1\u002F",[14,814,815],{},"针对拼音重名（如\"文章\"与\"纹章\"拼音相同）的情况，采用构建时预计算映射表的方式，按标签字典序为冲突项添加数字后缀，确保每条 URL 唯一。",[14,817,544,818,821],{},[18,819,820],{},"浏览器兼容扩展","。本次迁移明确将兼容范围扩展至 Internet Explorer 7 及以上版本。主要策略包括：",[32,823,824,827,830,837,852],{},[35,825,826],{},"输出产物不含 ES6+ 语法，脚本以 ES5 形式书写；",[35,828,829],{},"使用 jQuery 1.12.4 作为 DOM 操作与 AJAX 的兼容层；",[35,831,832,833,836],{},"补充 ",[74,834,835],{},"ie7.css"," 专用补丁样式，通过条件注释仅向 IE7 及以下加载；",[35,838,839,840,843,844,847,848,851],{},"布局以 ",[74,841,842],{},"float"," + ",[74,845,846],{},"inline-block"," 为基准，",[74,849,850],{},"flex"," 仅作现代浏览器增强；",[35,853,854],{},"不使用 CSS 变量作为唯一值来源，均带 fallback。",[14,856,857],{},"需要说明的是，IE7 用户仅能获得静态内容阅读能力，动态功能（如评论、检索、发布后台）不在此兼容范围内。",[14,859,551,860,863],{},[18,861,862],{},"工程化完善","。新增构建前清理步骤，每次构建均先删除旧产物目录，避免历史文件残留。同时补充：",[32,865,866,873,879,885],{},[35,867,868,869,872],{},"站点地图（",[74,870,871],{},"sitemap.xml","）；",[35,874,875,876,872],{},"内容订阅（",[74,877,878],{},"feed.xml",[35,880,881,882,872],{},"搜索引擎规则（",[74,883,884],{},"robots.txt",[35,886,887],{},"自定义 404 页面。",[14,889,890,891,894],{},"（七）",[18,892,893],{},"内容创作方式调整","。文章由 Vue 组件形式调整为标准 Markdown 文件，正文中可直接引用 Nunjucks 宏、读取站点全局数据，无需编写脚本逻辑。组件调用与 Markdown 语法可混用，写作门槛降低。",[28,896,898],{"id":897},"三迁移后效果","三、迁移后效果",[14,900,483,901,904],{},[18,902,903],{},"内容为先","。页面以纯 HTML 交付，禁用脚本的浏览器、早期浏览器、文本浏览器均可正常阅读。",[14,906,494,907,910],{},[18,908,909],{},"构建轻量","。站点不再包含应用级 JavaScript 框架，构建产物体积显著下降，构建时间缩短。",[14,912,520,913,916],{},[18,914,915],{},"样式可控","。样式按页面按需加载，避免了全站样式的冗余加载，也便于后续按组件粒度调整。",[14,918,537,919,922],{},[18,920,921],{},"URL 稳定","。标签、归档、文章等各类页面 URL 规范统一，便于分享、收藏与搜索引擎收录。",[14,924,544,925,928],{},[18,926,927],{},"维护便利","。新增文章仅需添加 Markdown 文件，无需改动路由、组件或构建脚本。",[28,930,932],{"id":931},"四后续工作","四、后续工作",[14,934,935],{},"（一）逐步将原站其他栏目内容迁移至新架构，保持 URL 结构一致性。",[14,937,938],{},"（二）针对现代浏览器补充增强功能，例如评论、检索、阅读进度指示等，以渐进增强方式提供，不影响基础阅读。",[14,940,941,942,944],{},"（三）持续监测 IE7 等早期浏览器下的可读性，发现问题及时在 ",[74,943,835],{}," 中补充补丁。",[14,946,947],{},"（四）完善发布流程，探索基于 Cloudflare Workers 与 GitHub API 的在线发布方案，降低内容维护的技术门槛。",[28,949,951],{"id":950},"五说明","五、说明",[14,953,954],{},"本站为个人技术项目，本次迁移属技术架构调整，不涉及任何机构或组织的立场表达。视觉设计仍参照政府网站规范进行，旨在为用户提供规范、清晰、易读的信息服务。所有内容仅代表个人观点，与任何机构无关。",[14,956,957],{},"特此说明。",[959,960],"hr",{},[14,962,963],{},[18,964,965],{},"附：主要参考文件",[32,967,968,969,968,979,968,986,968,993],{},"\n  ",[35,970,971],{},[972,973,978],"a",{"href":974,"target":975,"rel":976},"https:\u002F\u002Fwww.11ty.dev\u002Fdocs\u002F","_blank",[977],"noopener","Eleventy 官方文档",[35,980,981],{},[972,982,985],{"href":983,"target":975,"rel":984},"https:\u002F\u002Fmozilla.github.io\u002Fnunjucks\u002F",[977],"Nunjucks 模板引擎文档",[35,987,988],{},[972,989,992],{"href":990,"target":975,"rel":991},"https:\u002F\u002Fapi.jquery.com\u002F",[977],"jQuery 1.12.4 API 文档",[35,994,995],{},[972,996,999],{"href":997,"target":975,"rel":998},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fzh-CN\u002Fdocs\u002FWeb\u002FHTML\u002FConditional_comments",[977],"MDN：条件注释（Conditional comments）",[14,1001,1002],{},[18,1003,1004],{},"简要说明",[32,1006,1007,1012,1017,1023],{},[35,1008,1009,1011],{},[18,1010,592],{},"：静态站点生成器，构建时渲染全部页面，输出纯 HTML。",[35,1013,1014,1016],{},[18,1015,590],{},"：Mozilla 开发的 JavaScript 模板引擎，本站用于组件化与数据渲染。",[35,1018,1019,1022],{},[18,1020,1021],{},"jQuery 1.12.4","：jQuery 1.x 系列末版，兼容 IE6 及以上浏览器。",[35,1024,1025,1028],{},[18,1026,1027],{},"条件注释","：Internet Explorer 专属的 HTML 注释语法，用于向特定版本 IE 加载专用资源。",[558,1030,1031],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sCdxs, html code.shiki .sCdxs{--shiki-default:#F8F8F2}html pre.shiki code .s8I7P, html code.shiki .s8I7P{--shiki-default:#F92672}html pre.shiki code .sHkqI, html code.shiki .sHkqI{--shiki-default:#A6E22E}html pre.shiki code .s_Ekj, html code.shiki .s_Ekj{--shiki-default:#E6DB74}",{"title":48,"searchDepth":49,"depth":49,"links":1033},[1034,1035,1036,1037,1038],{"id":604,"depth":49,"text":605},{"id":643,"depth":49,"text":644},{"id":897,"depth":49,"text":898},{"id":931,"depth":49,"text":932},{"id":950,"depth":49,"text":951},{},"\u002Fsite-migration-compliance-2026-10-03",{"title":596,"description":601},"site-migration-compliance-2026-10-03",[1044,1045,1046],"技术架构","迁移","公告","I5WZy1gbyyF-BrpyA0tPrpwRa21nFwadDoAgqXlaHCo",{"id":1049,"title":1050,"author":8,"body":1051,"cover":582,"date":3345,"description":1055,"extension":55,"meta":3346,"navigation":57,"path":3347,"seo":3348,"stem":3349,"tags":3350,"__hash__":3353},"content\u002Fgit-memo-2026-09-25.md","Git 备忘录",{"type":11,"value":1052,"toc":3314},[1053,1056,1060,1274,1278,1389,1393,1459,1463,1650,1653,1731,1739,1743,1746,1814,1817,1871,1874,1918,1921,2012,2015,2050,2060,2064,2166,2169,2173,2339,2351,2355,2452,2456,2600,2604,2608,2627,2630,2655,2659,2705,2709,2749,2753,2796,2799,2821,2825,2836,2866,2869,2873,2913,2922,2926,2932,2935,3025,3028,3034,3038,3222,3226,3278,3281,3283,3286,3311],[14,1054,1055],{},"日常高频命令速查。按\"场景\"而非\"命令字母\"组织，便于出问题时直接翻。",[28,1057,1059],{"id":1058},"一配置","一、配置",[89,1061,1065],{"className":1062,"code":1063,"language":1064,"meta":48,"style":48},"language-bash shiki shiki-themes monokai","# 用户信息（全局）\ngit config --global user.name \"Your Name\"\ngit config --global user.email \"you@example.com\"\n\n# 换行符（Windows 推荐）\ngit config --global core.autocrlf true\n\n# 中文文件名不乱码\ngit config --global core.quotepath false\n\n# 默认分支名\ngit config --global init.defaultBranch main\n\n# 常用别名\ngit config --global alias.st status\ngit config --global alias.co checkout\ngit config --global alias.br branch\ngit config --global alias.lg \"log --oneline --graph --decorate --all\"\n\n# 查看所有配置\ngit config --list --show-origin\n","bash",[74,1066,1067,1073,1091,1105,1109,1114,1128,1132,1138,1153,1158,1164,1179,1184,1190,1205,1220,1235,1250,1255,1261],{"__ignoreMap":48},[97,1068,1069],{"class":99,"line":100},[97,1070,1072],{"class":1071},"snpHw","# 用户信息（全局）\n",[97,1074,1075,1078,1081,1085,1088],{"class":99,"line":49},[97,1076,1077],{"class":704},"git",[97,1079,1080],{"class":711}," config",[97,1082,1084],{"class":1083},"s7s5_"," --global",[97,1086,1087],{"class":711}," user.name",[97,1089,1090],{"class":711}," \"Your Name\"\n",[97,1092,1093,1095,1097,1099,1102],{"class":99,"line":111},[97,1094,1077],{"class":704},[97,1096,1080],{"class":711},[97,1098,1084],{"class":1083},[97,1100,1101],{"class":711}," user.email",[97,1103,1104],{"class":711}," \"you@example.com\"\n",[97,1106,1107],{"class":99,"line":196},[97,1108,108],{"emptyLinePlaceholder":57},[97,1110,1111],{"class":99,"line":202},[97,1112,1113],{"class":1071},"# 换行符（Windows 推荐）\n",[97,1115,1116,1118,1120,1122,1125],{"class":99,"line":343},[97,1117,1077],{"class":704},[97,1119,1080],{"class":711},[97,1121,1084],{"class":1083},[97,1123,1124],{"class":711}," core.autocrlf",[97,1126,1127],{"class":1083}," true\n",[97,1129,1130],{"class":99,"line":349},[97,1131,108],{"emptyLinePlaceholder":57},[97,1133,1135],{"class":99,"line":1134},8,[97,1136,1137],{"class":1071},"# 中文文件名不乱码\n",[97,1139,1141,1143,1145,1147,1150],{"class":99,"line":1140},9,[97,1142,1077],{"class":704},[97,1144,1080],{"class":711},[97,1146,1084],{"class":1083},[97,1148,1149],{"class":711}," core.quotepath",[97,1151,1152],{"class":1083}," false\n",[97,1154,1156],{"class":99,"line":1155},10,[97,1157,108],{"emptyLinePlaceholder":57},[97,1159,1161],{"class":99,"line":1160},11,[97,1162,1163],{"class":1071},"# 默认分支名\n",[97,1165,1167,1169,1171,1173,1176],{"class":99,"line":1166},12,[97,1168,1077],{"class":704},[97,1170,1080],{"class":711},[97,1172,1084],{"class":1083},[97,1174,1175],{"class":711}," init.defaultBranch",[97,1177,1178],{"class":711}," main\n",[97,1180,1182],{"class":99,"line":1181},13,[97,1183,108],{"emptyLinePlaceholder":57},[97,1185,1187],{"class":99,"line":1186},14,[97,1188,1189],{"class":1071},"# 常用别名\n",[97,1191,1193,1195,1197,1199,1202],{"class":99,"line":1192},15,[97,1194,1077],{"class":704},[97,1196,1080],{"class":711},[97,1198,1084],{"class":1083},[97,1200,1201],{"class":711}," alias.st",[97,1203,1204],{"class":711}," status\n",[97,1206,1208,1210,1212,1214,1217],{"class":99,"line":1207},16,[97,1209,1077],{"class":704},[97,1211,1080],{"class":711},[97,1213,1084],{"class":1083},[97,1215,1216],{"class":711}," alias.co",[97,1218,1219],{"class":711}," checkout\n",[97,1221,1223,1225,1227,1229,1232],{"class":99,"line":1222},17,[97,1224,1077],{"class":704},[97,1226,1080],{"class":711},[97,1228,1084],{"class":1083},[97,1230,1231],{"class":711}," alias.br",[97,1233,1234],{"class":711}," branch\n",[97,1236,1238,1240,1242,1244,1247],{"class":99,"line":1237},18,[97,1239,1077],{"class":704},[97,1241,1080],{"class":711},[97,1243,1084],{"class":1083},[97,1245,1246],{"class":711}," alias.lg",[97,1248,1249],{"class":711}," \"log --oneline --graph --decorate --all\"\n",[97,1251,1253],{"class":99,"line":1252},19,[97,1254,108],{"emptyLinePlaceholder":57},[97,1256,1258],{"class":99,"line":1257},20,[97,1259,1260],{"class":1071},"# 查看所有配置\n",[97,1262,1264,1266,1268,1271],{"class":99,"line":1263},21,[97,1265,1077],{"class":704},[97,1267,1080],{"class":711},[97,1269,1270],{"class":1083}," --list",[97,1272,1273],{"class":1083}," --show-origin\n",[28,1275,1277],{"id":1276},"二基础工作流","二、基础工作流",[89,1279,1281],{"className":1062,"code":1280,"language":1064,"meta":48,"style":48},"git status                    # 查看工作区状态\ngit add \u003Cfile>                # 暂存指定文件\ngit add .                     # 暂存所有改动（不含删除）\ngit add -A                    # 暂存所有改动（含删除）\ngit commit -m \"message\"       # 提交\ngit commit -am \"message\"      # 跳过 add，直接提交已跟踪文件\ngit push                      # 推送\ngit pull                      # 拉取并合并\n",[74,1282,1283,1293,1315,1327,1339,1355,1369,1379],{"__ignoreMap":48},[97,1284,1285,1287,1290],{"class":99,"line":100},[97,1286,1077],{"class":704},[97,1288,1289],{"class":711}," status",[97,1291,1292],{"class":1071},"                    # 查看工作区状态\n",[97,1294,1295,1297,1300,1303,1306,1309,1312],{"class":99,"line":49},[97,1296,1077],{"class":704},[97,1298,1299],{"class":711}," add",[97,1301,1302],{"class":700}," \u003C",[97,1304,1305],{"class":711},"fil",[97,1307,1308],{"class":696},"e",[97,1310,1311],{"class":700},">",[97,1313,1314],{"class":1071},"                # 暂存指定文件\n",[97,1316,1317,1319,1321,1324],{"class":99,"line":111},[97,1318,1077],{"class":704},[97,1320,1299],{"class":711},[97,1322,1323],{"class":711}," .",[97,1325,1326],{"class":1071},"                     # 暂存所有改动（不含删除）\n",[97,1328,1329,1331,1333,1336],{"class":99,"line":196},[97,1330,1077],{"class":704},[97,1332,1299],{"class":711},[97,1334,1335],{"class":1083}," -A",[97,1337,1338],{"class":1071},"                    # 暂存所有改动（含删除）\n",[97,1340,1341,1343,1346,1349,1352],{"class":99,"line":202},[97,1342,1077],{"class":704},[97,1344,1345],{"class":711}," commit",[97,1347,1348],{"class":1083}," -m",[97,1350,1351],{"class":711}," \"message\"",[97,1353,1354],{"class":1071},"       # 提交\n",[97,1356,1357,1359,1361,1364,1366],{"class":99,"line":343},[97,1358,1077],{"class":704},[97,1360,1345],{"class":711},[97,1362,1363],{"class":1083}," -am",[97,1365,1351],{"class":711},[97,1367,1368],{"class":1071},"      # 跳过 add，直接提交已跟踪文件\n",[97,1370,1371,1373,1376],{"class":99,"line":349},[97,1372,1077],{"class":704},[97,1374,1375],{"class":711}," push",[97,1377,1378],{"class":1071},"                      # 推送\n",[97,1380,1381,1383,1386],{"class":99,"line":1134},[97,1382,1077],{"class":704},[97,1384,1385],{"class":711}," pull",[97,1387,1388],{"class":1071},"                      # 拉取并合并\n",[1390,1391,1392],"h3",{"id":1392},"查看差异",[89,1394,1396],{"className":1062,"code":1395,"language":1064,"meta":48,"style":48},"git diff                      # 工作区 vs 暂存区\ngit diff --staged             # 暂存区 vs 最新提交\ngit diff HEAD                 # 工作区 + 暂存区 vs 最新提交\ngit diff \u003Cbranch1>..\u003Cbranch2> # 两分支差异\n",[74,1397,1398,1408,1420,1432],{"__ignoreMap":48},[97,1399,1400,1402,1405],{"class":99,"line":100},[97,1401,1077],{"class":704},[97,1403,1404],{"class":711}," diff",[97,1406,1407],{"class":1071},"                      # 工作区 vs 暂存区\n",[97,1409,1410,1412,1414,1417],{"class":99,"line":49},[97,1411,1077],{"class":704},[97,1413,1404],{"class":711},[97,1415,1416],{"class":1083}," --staged",[97,1418,1419],{"class":1071},"             # 暂存区 vs 最新提交\n",[97,1421,1422,1424,1426,1429],{"class":99,"line":111},[97,1423,1077],{"class":704},[97,1425,1404],{"class":711},[97,1427,1428],{"class":711}," HEAD",[97,1430,1431],{"class":1071},"                 # 工作区 + 暂存区 vs 最新提交\n",[97,1433,1434,1436,1438,1440,1443,1446,1449,1451,1453,1456],{"class":99,"line":196},[97,1435,1077],{"class":704},[97,1437,1404],{"class":711},[97,1439,1302],{"class":700},[97,1441,1442],{"class":711},"branch",[97,1444,1445],{"class":700},"1>",[97,1447,1448],{"class":711},"..",[97,1450,697],{"class":700},[97,1452,1442],{"class":711},[97,1454,1455],{"class":700},"2>",[97,1457,1458],{"class":1071}," # 两分支差异\n",[28,1460,1462],{"id":1461},"三分支","三、分支",[89,1464,1466],{"className":1062,"code":1465,"language":1064,"meta":48,"style":48},"git branch                    # 查看本地分支\ngit branch -a                 # 查看所有分支（含远程）\ngit branch -vv                # 查看分支及跟踪关系\ngit branch \u003Cname>             # 创建分支\ngit switch \u003Cname>             # 切换分支（新版推荐）\ngit switch -c \u003Cname>          # 创建并切换\ngit checkout -b \u003Cname>        # 同上（旧版写法）\ngit branch -d \u003Cname>          # 删除已合并分支\ngit branch -D \u003Cname>          # 强制删除\ngit branch -m \u003Cold> \u003Cnew>     # 重命名分支\n",[74,1467,1468,1478,1490,1502,1520,1538,1558,1579,1599,1619],{"__ignoreMap":48},[97,1469,1470,1472,1475],{"class":99,"line":100},[97,1471,1077],{"class":704},[97,1473,1474],{"class":711}," branch",[97,1476,1477],{"class":1071},"                    # 查看本地分支\n",[97,1479,1480,1482,1484,1487],{"class":99,"line":49},[97,1481,1077],{"class":704},[97,1483,1474],{"class":711},[97,1485,1486],{"class":1083}," -a",[97,1488,1489],{"class":1071},"                 # 查看所有分支（含远程）\n",[97,1491,1492,1494,1496,1499],{"class":99,"line":111},[97,1493,1077],{"class":704},[97,1495,1474],{"class":711},[97,1497,1498],{"class":1083}," -vv",[97,1500,1501],{"class":1071},"                # 查看分支及跟踪关系\n",[97,1503,1504,1506,1508,1510,1513,1515,1517],{"class":99,"line":196},[97,1505,1077],{"class":704},[97,1507,1474],{"class":711},[97,1509,1302],{"class":700},[97,1511,1512],{"class":711},"nam",[97,1514,1308],{"class":696},[97,1516,1311],{"class":700},[97,1518,1519],{"class":1071},"             # 创建分支\n",[97,1521,1522,1524,1527,1529,1531,1533,1535],{"class":99,"line":202},[97,1523,1077],{"class":704},[97,1525,1526],{"class":711}," switch",[97,1528,1302],{"class":700},[97,1530,1512],{"class":711},[97,1532,1308],{"class":696},[97,1534,1311],{"class":700},[97,1536,1537],{"class":1071},"             # 切换分支（新版推荐）\n",[97,1539,1540,1542,1544,1547,1549,1551,1553,1555],{"class":99,"line":343},[97,1541,1077],{"class":704},[97,1543,1526],{"class":711},[97,1545,1546],{"class":1083}," -c",[97,1548,1302],{"class":700},[97,1550,1512],{"class":711},[97,1552,1308],{"class":696},[97,1554,1311],{"class":700},[97,1556,1557],{"class":1071},"          # 创建并切换\n",[97,1559,1560,1562,1565,1568,1570,1572,1574,1576],{"class":99,"line":349},[97,1561,1077],{"class":704},[97,1563,1564],{"class":711}," checkout",[97,1566,1567],{"class":1083}," -b",[97,1569,1302],{"class":700},[97,1571,1512],{"class":711},[97,1573,1308],{"class":696},[97,1575,1311],{"class":700},[97,1577,1578],{"class":1071},"        # 同上（旧版写法）\n",[97,1580,1581,1583,1585,1588,1590,1592,1594,1596],{"class":99,"line":1134},[97,1582,1077],{"class":704},[97,1584,1474],{"class":711},[97,1586,1587],{"class":1083}," -d",[97,1589,1302],{"class":700},[97,1591,1512],{"class":711},[97,1593,1308],{"class":696},[97,1595,1311],{"class":700},[97,1597,1598],{"class":1071},"          # 删除已合并分支\n",[97,1600,1601,1603,1605,1608,1610,1612,1614,1616],{"class":99,"line":1140},[97,1602,1077],{"class":704},[97,1604,1474],{"class":711},[97,1606,1607],{"class":1083}," -D",[97,1609,1302],{"class":700},[97,1611,1512],{"class":711},[97,1613,1308],{"class":696},[97,1615,1311],{"class":700},[97,1617,1618],{"class":1071},"          # 强制删除\n",[97,1620,1621,1623,1625,1627,1629,1632,1635,1637,1639,1642,1645,1647],{"class":99,"line":1155},[97,1622,1077],{"class":704},[97,1624,1474],{"class":711},[97,1626,1348],{"class":1083},[97,1628,1302],{"class":700},[97,1630,1631],{"class":711},"ol",[97,1633,1634],{"class":696},"d",[97,1636,1311],{"class":700},[97,1638,1302],{"class":700},[97,1640,1641],{"class":711},"ne",[97,1643,1644],{"class":696},"w",[97,1646,1311],{"class":700},[97,1648,1649],{"class":1071},"     # 重命名分支\n",[1390,1651,1652],{"id":1652},"合并与变基",[89,1654,1656],{"className":1062,"code":1655,"language":1064,"meta":48,"style":48},"git merge \u003Cbranch>            # 合并到当前分支（保留历史）\ngit merge --no-ff \u003Cbranch>    # 强制生成合并提交\ngit rebase \u003Cbranch>           # 变基（线性历史）\ngit rebase -i HEAD~3          # 交互式变基，重写最近 3 条提交\n",[74,1657,1658,1678,1698,1716],{"__ignoreMap":48},[97,1659,1660,1662,1665,1667,1670,1673,1675],{"class":99,"line":100},[97,1661,1077],{"class":704},[97,1663,1664],{"class":711}," merge",[97,1666,1302],{"class":700},[97,1668,1669],{"class":711},"branc",[97,1671,1672],{"class":696},"h",[97,1674,1311],{"class":700},[97,1676,1677],{"class":1071},"            # 合并到当前分支（保留历史）\n",[97,1679,1680,1682,1684,1687,1689,1691,1693,1695],{"class":99,"line":49},[97,1681,1077],{"class":704},[97,1683,1664],{"class":711},[97,1685,1686],{"class":1083}," --no-ff",[97,1688,1302],{"class":700},[97,1690,1669],{"class":711},[97,1692,1672],{"class":696},[97,1694,1311],{"class":700},[97,1696,1697],{"class":1071},"    # 强制生成合并提交\n",[97,1699,1700,1702,1705,1707,1709,1711,1713],{"class":99,"line":111},[97,1701,1077],{"class":704},[97,1703,1704],{"class":711}," rebase",[97,1706,1302],{"class":700},[97,1708,1669],{"class":711},[97,1710,1672],{"class":696},[97,1712,1311],{"class":700},[97,1714,1715],{"class":1071},"           # 变基（线性历史）\n",[97,1717,1718,1720,1722,1725,1728],{"class":99,"line":196},[97,1719,1077],{"class":704},[97,1721,1704],{"class":711},[97,1723,1724],{"class":1083}," -i",[97,1726,1727],{"class":711}," HEAD~3",[97,1729,1730],{"class":1071},"          # 交互式变基，重写最近 3 条提交\n",[42,1732,1733],{},[14,1734,1735,1738],{},[18,1736,1737],{},"原则","：已推送到共享远程的分支不要 rebase；只在本地分支上用。",[28,1740,1742],{"id":1741},"四撤销与回退","四、撤销与回退",[14,1744,1745],{},"这是最容易踩坑的地方，先分清三种\"撤销\"：",[356,1747,1748,1764],{},[359,1749,1750],{},[362,1751,1752,1755,1758,1761],{},[365,1753,1754],{},"命令",[365,1756,1757],{},"作用范围",[365,1759,1760],{},"是否修改历史",[365,1762,1763],{},"使用场景",[375,1765,1766,1782,1798],{},[362,1767,1768,1773,1776,1779],{},[380,1769,1770],{},[74,1771,1772],{},"git restore",[380,1774,1775],{},"工作区 \u002F 暂存区",[380,1777,1778],{},"否",[380,1780,1781],{},"丢弃未提交的修改",[362,1783,1784,1789,1792,1795],{},[380,1785,1786],{},[74,1787,1788],{},"git reset",[380,1790,1791],{},"暂存区 \u002F 提交历史",[380,1793,1794],{},"是",[380,1796,1797],{},"撤销提交（未推送）",[362,1799,1800,1805,1808,1811],{},[380,1801,1802],{},[74,1803,1804],{},"git revert",[380,1806,1807],{},"提交历史",[380,1809,1810],{},"否（新增反向提交）",[380,1812,1813],{},"撤销已推送的提交",[1390,1815,1816],{"id":1816},"丢弃工作区修改",[89,1818,1820],{"className":1062,"code":1819,"language":1064,"meta":48,"style":48},"git restore \u003Cfile>            # 丢弃单个文件的未暂存修改\ngit restore .                 # 丢弃所有未暂存修改（危险）\ngit checkout -- \u003Cfile>        # 旧版写法\n",[74,1821,1822,1840,1851],{"__ignoreMap":48},[97,1823,1824,1826,1829,1831,1833,1835,1837],{"class":99,"line":100},[97,1825,1077],{"class":704},[97,1827,1828],{"class":711}," restore",[97,1830,1302],{"class":700},[97,1832,1305],{"class":711},[97,1834,1308],{"class":696},[97,1836,1311],{"class":700},[97,1838,1839],{"class":1071},"            # 丢弃单个文件的未暂存修改\n",[97,1841,1842,1844,1846,1848],{"class":99,"line":49},[97,1843,1077],{"class":704},[97,1845,1828],{"class":711},[97,1847,1323],{"class":711},[97,1849,1850],{"class":1071},"                 # 丢弃所有未暂存修改（危险）\n",[97,1852,1853,1855,1857,1860,1862,1864,1866,1868],{"class":99,"line":111},[97,1854,1077],{"class":704},[97,1856,1564],{"class":711},[97,1858,1859],{"class":1083}," --",[97,1861,1302],{"class":700},[97,1863,1305],{"class":711},[97,1865,1308],{"class":696},[97,1867,1311],{"class":700},[97,1869,1870],{"class":1071},"        # 旧版写法\n",[1390,1872,1873],{"id":1873},"取消暂存",[89,1875,1877],{"className":1062,"code":1876,"language":1064,"meta":48,"style":48},"git restore --staged \u003Cfile>   # 从暂存区移回工作区\ngit reset HEAD \u003Cfile>         # 旧版写法\n",[74,1878,1879,1898],{"__ignoreMap":48},[97,1880,1881,1883,1885,1887,1889,1891,1893,1895],{"class":99,"line":100},[97,1882,1077],{"class":704},[97,1884,1828],{"class":711},[97,1886,1416],{"class":1083},[97,1888,1302],{"class":700},[97,1890,1305],{"class":711},[97,1892,1308],{"class":696},[97,1894,1311],{"class":700},[97,1896,1897],{"class":1071},"   # 从暂存区移回工作区\n",[97,1899,1900,1902,1905,1907,1909,1911,1913,1915],{"class":99,"line":49},[97,1901,1077],{"class":704},[97,1903,1904],{"class":711}," reset",[97,1906,1428],{"class":711},[97,1908,1302],{"class":700},[97,1910,1305],{"class":711},[97,1912,1308],{"class":696},[97,1914,1311],{"class":700},[97,1916,1917],{"class":1071},"         # 旧版写法\n",[1390,1919,1920],{"id":1920},"撤销提交",[89,1922,1924],{"className":1062,"code":1923,"language":1064,"meta":48,"style":48},"# 保留改动在工作区\ngit reset --soft HEAD~1\n\n# 保留改动在暂存区\ngit reset --mixed HEAD~1      # 默认\n\n# 彻底丢弃改动（危险）\ngit reset --hard HEAD~1\n\n# 撤销已推送的提交（安全）\ngit revert \u003Ccommit-hash>\n",[74,1925,1926,1931,1943,1947,1952,1967,1971,1976,1987,1991,1996],{"__ignoreMap":48},[97,1927,1928],{"class":99,"line":100},[97,1929,1930],{"class":1071},"# 保留改动在工作区\n",[97,1932,1933,1935,1937,1940],{"class":99,"line":49},[97,1934,1077],{"class":704},[97,1936,1904],{"class":711},[97,1938,1939],{"class":1083}," --soft",[97,1941,1942],{"class":711}," HEAD~1\n",[97,1944,1945],{"class":99,"line":111},[97,1946,108],{"emptyLinePlaceholder":57},[97,1948,1949],{"class":99,"line":196},[97,1950,1951],{"class":1071},"# 保留改动在暂存区\n",[97,1953,1954,1956,1958,1961,1964],{"class":99,"line":202},[97,1955,1077],{"class":704},[97,1957,1904],{"class":711},[97,1959,1960],{"class":1083}," --mixed",[97,1962,1963],{"class":711}," HEAD~1",[97,1965,1966],{"class":1071},"      # 默认\n",[97,1968,1969],{"class":99,"line":343},[97,1970,108],{"emptyLinePlaceholder":57},[97,1972,1973],{"class":99,"line":349},[97,1974,1975],{"class":1071},"# 彻底丢弃改动（危险）\n",[97,1977,1978,1980,1982,1985],{"class":99,"line":1134},[97,1979,1077],{"class":704},[97,1981,1904],{"class":711},[97,1983,1984],{"class":1083}," --hard",[97,1986,1942],{"class":711},[97,1988,1989],{"class":99,"line":1140},[97,1990,108],{"emptyLinePlaceholder":57},[97,1992,1993],{"class":99,"line":1155},[97,1994,1995],{"class":1071},"# 撤销已推送的提交（安全）\n",[97,1997,1998,2000,2003,2005,2008,2010],{"class":99,"line":1160},[97,1999,1077],{"class":704},[97,2001,2002],{"class":711}," revert",[97,2004,1302],{"class":700},[97,2006,2007],{"class":711},"commit-has",[97,2009,1672],{"class":696},[97,2011,720],{"class":700},[1390,2013,2014],{"id":2014},"找回丢失的提交",[89,2016,2018],{"className":1062,"code":2017,"language":1064,"meta":48,"style":48},"git reflog                    # 查看 HEAD 移动历史\ngit reset --hard \u003Chash>       # 回到某个历史位置\n",[74,2019,2020,2030],{"__ignoreMap":48},[97,2021,2022,2024,2027],{"class":99,"line":100},[97,2023,1077],{"class":704},[97,2025,2026],{"class":711}," reflog",[97,2028,2029],{"class":1071},"                    # 查看 HEAD 移动历史\n",[97,2031,2032,2034,2036,2038,2040,2043,2045,2047],{"class":99,"line":49},[97,2033,1077],{"class":704},[97,2035,1904],{"class":711},[97,2037,1984],{"class":1083},[97,2039,1302],{"class":700},[97,2041,2042],{"class":711},"has",[97,2044,1672],{"class":696},[97,2046,1311],{"class":700},[97,2048,2049],{"class":1071},"       # 回到某个历史位置\n",[14,2051,2052,2055,2056,2059],{},[74,2053,2054],{},"reset --hard"," 后如果后悔，",[74,2057,2058],{},"reflog"," 通常能救回来，除非已经 GC。",[28,2061,2063],{"id":2062},"五贮藏stash","五、贮藏（stash）",[89,2065,2067],{"className":1062,"code":2066,"language":1064,"meta":48,"style":48},"git stash                     # 贮藏当前改动\ngit stash -u                  # 含未跟踪文件\ngit stash list                # 查看贮藏列表\ngit stash pop                 # 弹出最近贮藏并删除\ngit stash apply stash@{0}     # 应用指定贮藏（保留）\ngit stash drop stash@{0}      # 删除指定贮藏\ngit stash clear               # 清空所有贮藏\n",[74,2068,2069,2079,2091,2103,2115,2136,2154],{"__ignoreMap":48},[97,2070,2071,2073,2076],{"class":99,"line":100},[97,2072,1077],{"class":704},[97,2074,2075],{"class":711}," stash",[97,2077,2078],{"class":1071},"                     # 贮藏当前改动\n",[97,2080,2081,2083,2085,2088],{"class":99,"line":49},[97,2082,1077],{"class":704},[97,2084,2075],{"class":711},[97,2086,2087],{"class":1083}," -u",[97,2089,2090],{"class":1071},"                  # 含未跟踪文件\n",[97,2092,2093,2095,2097,2100],{"class":99,"line":111},[97,2094,1077],{"class":704},[97,2096,2075],{"class":711},[97,2098,2099],{"class":711}," list",[97,2101,2102],{"class":1071},"                # 查看贮藏列表\n",[97,2104,2105,2107,2109,2112],{"class":99,"line":196},[97,2106,1077],{"class":704},[97,2108,2075],{"class":711},[97,2110,2111],{"class":711}," pop",[97,2113,2114],{"class":1071},"                 # 弹出最近贮藏并删除\n",[97,2116,2117,2119,2121,2124,2127,2130,2133],{"class":99,"line":202},[97,2118,1077],{"class":704},[97,2120,2075],{"class":711},[97,2122,2123],{"class":711}," apply",[97,2125,2126],{"class":711}," stash@{",[97,2128,2129],{"class":1083},"0",[97,2131,2132],{"class":711},"}",[97,2134,2135],{"class":1071},"     # 应用指定贮藏（保留）\n",[97,2137,2138,2140,2142,2145,2147,2149,2151],{"class":99,"line":343},[97,2139,1077],{"class":704},[97,2141,2075],{"class":711},[97,2143,2144],{"class":711}," drop",[97,2146,2126],{"class":711},[97,2148,2129],{"class":1083},[97,2150,2132],{"class":711},[97,2152,2153],{"class":1071},"      # 删除指定贮藏\n",[97,2155,2156,2158,2160,2163],{"class":99,"line":349},[97,2157,1077],{"class":704},[97,2159,2075],{"class":711},[97,2161,2162],{"class":711}," clear",[97,2164,2165],{"class":1071},"               # 清空所有贮藏\n",[14,2167,2168],{},"常见场景：改了一半，突然要切分支修 bug。",[28,2170,2172],{"id":2171},"六远程","六、远程",[89,2174,2176],{"className":1062,"code":2175,"language":1064,"meta":48,"style":48},"git remote -v                 # 查看远程仓库\ngit remote add origin \u003Curl>   # 添加远程\ngit remote set-url origin \u003Curl> # 修改远程地址\ngit remote remove origin      # 删除远程\n\ngit fetch                     # 拉取远程信息，不合并\ngit pull                      # fetch + merge\ngit pull --rebase             # fetch + rebase\ngit push                      # 推送\ngit push -u origin \u003Cbranch>   # 首次推送并建立跟踪\ngit push --force-with-lease   # 安全强推（推荐）\ngit push --force              # 强推（危险）\n",[74,2177,2178,2191,2215,2237,2251,2255,2265,2274,2286,2294,2315,2327],{"__ignoreMap":48},[97,2179,2180,2182,2185,2188],{"class":99,"line":100},[97,2181,1077],{"class":704},[97,2183,2184],{"class":711}," remote",[97,2186,2187],{"class":1083}," -v",[97,2189,2190],{"class":1071},"                 # 查看远程仓库\n",[97,2192,2193,2195,2197,2199,2202,2204,2207,2210,2212],{"class":99,"line":49},[97,2194,1077],{"class":704},[97,2196,2184],{"class":711},[97,2198,1299],{"class":711},[97,2200,2201],{"class":711}," origin",[97,2203,1302],{"class":700},[97,2205,2206],{"class":711},"ur",[97,2208,2209],{"class":696},"l",[97,2211,1311],{"class":700},[97,2213,2214],{"class":1071},"   # 添加远程\n",[97,2216,2217,2219,2221,2224,2226,2228,2230,2232,2234],{"class":99,"line":111},[97,2218,1077],{"class":704},[97,2220,2184],{"class":711},[97,2222,2223],{"class":711}," set-url",[97,2225,2201],{"class":711},[97,2227,1302],{"class":700},[97,2229,2206],{"class":711},[97,2231,2209],{"class":696},[97,2233,1311],{"class":700},[97,2235,2236],{"class":1071}," # 修改远程地址\n",[97,2238,2239,2241,2243,2246,2248],{"class":99,"line":196},[97,2240,1077],{"class":704},[97,2242,2184],{"class":711},[97,2244,2245],{"class":711}," remove",[97,2247,2201],{"class":711},[97,2249,2250],{"class":1071},"      # 删除远程\n",[97,2252,2253],{"class":99,"line":202},[97,2254,108],{"emptyLinePlaceholder":57},[97,2256,2257,2259,2262],{"class":99,"line":343},[97,2258,1077],{"class":704},[97,2260,2261],{"class":711}," fetch",[97,2263,2264],{"class":1071},"                     # 拉取远程信息，不合并\n",[97,2266,2267,2269,2271],{"class":99,"line":349},[97,2268,1077],{"class":704},[97,2270,1385],{"class":711},[97,2272,2273],{"class":1071},"                      # fetch + merge\n",[97,2275,2276,2278,2280,2283],{"class":99,"line":1134},[97,2277,1077],{"class":704},[97,2279,1385],{"class":711},[97,2281,2282],{"class":1083}," --rebase",[97,2284,2285],{"class":1071},"             # fetch + rebase\n",[97,2287,2288,2290,2292],{"class":99,"line":1140},[97,2289,1077],{"class":704},[97,2291,1375],{"class":711},[97,2293,1378],{"class":1071},[97,2295,2296,2298,2300,2302,2304,2306,2308,2310,2312],{"class":99,"line":1155},[97,2297,1077],{"class":704},[97,2299,1375],{"class":711},[97,2301,2087],{"class":1083},[97,2303,2201],{"class":711},[97,2305,1302],{"class":700},[97,2307,1669],{"class":711},[97,2309,1672],{"class":696},[97,2311,1311],{"class":700},[97,2313,2314],{"class":1071},"   # 首次推送并建立跟踪\n",[97,2316,2317,2319,2321,2324],{"class":99,"line":1160},[97,2318,1077],{"class":704},[97,2320,1375],{"class":711},[97,2322,2323],{"class":1083}," --force-with-lease",[97,2325,2326],{"class":1071},"   # 安全强推（推荐）\n",[97,2328,2329,2331,2333,2336],{"class":99,"line":1166},[97,2330,1077],{"class":704},[97,2332,1375],{"class":711},[97,2334,2335],{"class":1083}," --force",[97,2337,2338],{"class":1071},"              # 强推（危险）\n",[42,2340,2341],{},[14,2342,2343,2346,2347,2350],{},[18,2344,2345],{},"强推原则","：永远用 ",[74,2348,2349],{},"--force-with-lease","，它会检查远程是否有人推过新提交，避免误覆盖别人的工作。",[28,2352,2354],{"id":2353},"七标签","七、标签",[89,2356,2358],{"className":1062,"code":2357,"language":1064,"meta":48,"style":48},"git tag                       # 查看标签\ngit tag v1.0.0                # 轻量标签\ngit tag -a v1.0.0 -m \"msg\"    # 附注标签（推荐）\ngit push origin v1.0.0        # 推送单个标签\ngit push --tags               # 推送所有标签\ngit tag -d v1.0.0             # 删除本地标签\ngit push origin :refs\u002Ftags\u002Fv1.0.0  # 删除远程标签\n",[74,2359,2360,2370,2382,2400,2413,2425,2438],{"__ignoreMap":48},[97,2361,2362,2364,2367],{"class":99,"line":100},[97,2363,1077],{"class":704},[97,2365,2366],{"class":711}," tag",[97,2368,2369],{"class":1071},"                       # 查看标签\n",[97,2371,2372,2374,2376,2379],{"class":99,"line":49},[97,2373,1077],{"class":704},[97,2375,2366],{"class":711},[97,2377,2378],{"class":711}," v1.0.0",[97,2380,2381],{"class":1071},"                # 轻量标签\n",[97,2383,2384,2386,2388,2390,2392,2394,2397],{"class":99,"line":111},[97,2385,1077],{"class":704},[97,2387,2366],{"class":711},[97,2389,1486],{"class":1083},[97,2391,2378],{"class":711},[97,2393,1348],{"class":1083},[97,2395,2396],{"class":711}," \"msg\"",[97,2398,2399],{"class":1071},"    # 附注标签（推荐）\n",[97,2401,2402,2404,2406,2408,2410],{"class":99,"line":196},[97,2403,1077],{"class":704},[97,2405,1375],{"class":711},[97,2407,2201],{"class":711},[97,2409,2378],{"class":711},[97,2411,2412],{"class":1071},"        # 推送单个标签\n",[97,2414,2415,2417,2419,2422],{"class":99,"line":202},[97,2416,1077],{"class":704},[97,2418,1375],{"class":711},[97,2420,2421],{"class":1083}," --tags",[97,2423,2424],{"class":1071},"               # 推送所有标签\n",[97,2426,2427,2429,2431,2433,2435],{"class":99,"line":343},[97,2428,1077],{"class":704},[97,2430,2366],{"class":711},[97,2432,1587],{"class":1083},[97,2434,2378],{"class":711},[97,2436,2437],{"class":1071},"             # 删除本地标签\n",[97,2439,2440,2442,2444,2446,2449],{"class":99,"line":349},[97,2441,1077],{"class":704},[97,2443,1375],{"class":711},[97,2445,2201],{"class":711},[97,2447,2448],{"class":711}," :refs\u002Ftags\u002Fv1.0.0",[97,2450,2451],{"class":1071},"  # 删除远程标签\n",[28,2453,2455],{"id":2454},"八查看历史","八、查看历史",[89,2457,2459],{"className":1062,"code":2458,"language":1064,"meta":48,"style":48},"git log                       # 完整日志\ngit log --oneline             # 单行\ngit log --oneline --graph     # 图形化\ngit log -p \u003Cfile>             # 查看某文件历史\ngit log --author=\"name\"       # 按作者过滤\ngit log --since=\"2 weeks ago\" # 按时间过滤\ngit log -S \"keyword\"          # 按内容变化搜索（pickaxe）\ngit blame \u003Cfile>              # 逐行查看最后修改者\ngit show \u003Ccommit>             # 查看某次提交详情\n",[74,2460,2461,2471,2483,2497,2517,2532,2547,2562,2580],{"__ignoreMap":48},[97,2462,2463,2465,2468],{"class":99,"line":100},[97,2464,1077],{"class":704},[97,2466,2467],{"class":711}," log",[97,2469,2470],{"class":1071},"                       # 完整日志\n",[97,2472,2473,2475,2477,2480],{"class":99,"line":49},[97,2474,1077],{"class":704},[97,2476,2467],{"class":711},[97,2478,2479],{"class":1083}," --oneline",[97,2481,2482],{"class":1071},"             # 单行\n",[97,2484,2485,2487,2489,2491,2494],{"class":99,"line":111},[97,2486,1077],{"class":704},[97,2488,2467],{"class":711},[97,2490,2479],{"class":1083},[97,2492,2493],{"class":1083}," --graph",[97,2495,2496],{"class":1071},"     # 图形化\n",[97,2498,2499,2501,2503,2506,2508,2510,2512,2514],{"class":99,"line":196},[97,2500,1077],{"class":704},[97,2502,2467],{"class":711},[97,2504,2505],{"class":1083}," -p",[97,2507,1302],{"class":700},[97,2509,1305],{"class":711},[97,2511,1308],{"class":696},[97,2513,1311],{"class":700},[97,2515,2516],{"class":1071},"             # 查看某文件历史\n",[97,2518,2519,2521,2523,2526,2529],{"class":99,"line":202},[97,2520,1077],{"class":704},[97,2522,2467],{"class":711},[97,2524,2525],{"class":1083}," --author=",[97,2527,2528],{"class":711},"\"name\"",[97,2530,2531],{"class":1071},"       # 按作者过滤\n",[97,2533,2534,2536,2538,2541,2544],{"class":99,"line":343},[97,2535,1077],{"class":704},[97,2537,2467],{"class":711},[97,2539,2540],{"class":1083}," --since=",[97,2542,2543],{"class":711},"\"2 weeks ago\"",[97,2545,2546],{"class":1071}," # 按时间过滤\n",[97,2548,2549,2551,2553,2556,2559],{"class":99,"line":349},[97,2550,1077],{"class":704},[97,2552,2467],{"class":711},[97,2554,2555],{"class":1083}," -S",[97,2557,2558],{"class":711}," \"keyword\"",[97,2560,2561],{"class":1071},"          # 按内容变化搜索（pickaxe）\n",[97,2563,2564,2566,2569,2571,2573,2575,2577],{"class":99,"line":1134},[97,2565,1077],{"class":704},[97,2567,2568],{"class":711}," blame",[97,2570,1302],{"class":700},[97,2572,1305],{"class":711},[97,2574,1308],{"class":696},[97,2576,1311],{"class":700},[97,2578,2579],{"class":1071},"              # 逐行查看最后修改者\n",[97,2581,2582,2584,2587,2589,2592,2595,2597],{"class":99,"line":1140},[97,2583,1077],{"class":704},[97,2585,2586],{"class":711}," show",[97,2588,1302],{"class":700},[97,2590,2591],{"class":711},"commi",[97,2593,2594],{"class":696},"t",[97,2596,1311],{"class":700},[97,2598,2599],{"class":1071},"             # 查看某次提交详情\n",[28,2601,2603],{"id":2602},"九常见问题","九、常见问题",[1390,2605,2607],{"id":2606},"_1-提交信息写错了未推送","1. 提交信息写错了（未推送）",[89,2609,2611],{"className":1062,"code":2610,"language":1064,"meta":48,"style":48},"git commit --amend -m \"new message\"\n",[74,2612,2613],{"__ignoreMap":48},[97,2614,2615,2617,2619,2622,2624],{"class":99,"line":100},[97,2616,1077],{"class":704},[97,2618,1345],{"class":711},[97,2620,2621],{"class":1083}," --amend",[97,2623,1348],{"class":1083},[97,2625,2626],{"class":711}," \"new message\"\n",[14,2628,2629],{},"如果只是想补充文件：",[89,2631,2633],{"className":1062,"code":2632,"language":1064,"meta":48,"style":48},"git add forgotten.txt\ngit commit --amend --no-edit\n",[74,2634,2635,2644],{"__ignoreMap":48},[97,2636,2637,2639,2641],{"class":99,"line":100},[97,2638,1077],{"class":704},[97,2640,1299],{"class":711},[97,2642,2643],{"class":711}," forgotten.txt\n",[97,2645,2646,2648,2650,2652],{"class":99,"line":49},[97,2647,1077],{"class":704},[97,2649,1345],{"class":711},[97,2651,2621],{"class":1083},[97,2653,2654],{"class":1083}," --no-edit\n",[1390,2656,2658],{"id":2657},"_2-提交到了错误的分支","2. 提交到了错误的分支",[89,2660,2662],{"className":1062,"code":2661,"language":1064,"meta":48,"style":48},"# 假设应该提交到 feature 分支，却提交到了 main\ngit branch feature                # 在当前位置创建分支\ngit reset --hard HEAD~1           # main 回退\ngit switch feature                # 切到 feature\n",[74,2663,2664,2669,2681,2694],{"__ignoreMap":48},[97,2665,2666],{"class":99,"line":100},[97,2667,2668],{"class":1071},"# 假设应该提交到 feature 分支，却提交到了 main\n",[97,2670,2671,2673,2675,2678],{"class":99,"line":49},[97,2672,1077],{"class":704},[97,2674,1474],{"class":711},[97,2676,2677],{"class":711}," feature",[97,2679,2680],{"class":1071},"                # 在当前位置创建分支\n",[97,2682,2683,2685,2687,2689,2691],{"class":99,"line":111},[97,2684,1077],{"class":704},[97,2686,1904],{"class":711},[97,2688,1984],{"class":1083},[97,2690,1963],{"class":711},[97,2692,2693],{"class":1071},"           # main 回退\n",[97,2695,2696,2698,2700,2702],{"class":99,"line":196},[97,2697,1077],{"class":704},[97,2699,1526],{"class":711},[97,2701,2677],{"class":711},[97,2703,2704],{"class":1071},"                # 切到 feature\n",[1390,2706,2708],{"id":2707},"_3-本地分支落后想同步远程","3. 本地分支落后，想同步远程",[89,2710,2712],{"className":1062,"code":2711,"language":1064,"meta":48,"style":48},"git fetch origin\ngit rebase origin\u002Fmain\n# 或者\ngit pull --rebase origin main\n",[74,2713,2714,2723,2732,2737],{"__ignoreMap":48},[97,2715,2716,2718,2720],{"class":99,"line":100},[97,2717,1077],{"class":704},[97,2719,2261],{"class":711},[97,2721,2722],{"class":711}," origin\n",[97,2724,2725,2727,2729],{"class":99,"line":49},[97,2726,1077],{"class":704},[97,2728,1704],{"class":711},[97,2730,2731],{"class":711}," origin\u002Fmain\n",[97,2733,2734],{"class":99,"line":111},[97,2735,2736],{"class":1071},"# 或者\n",[97,2738,2739,2741,2743,2745,2747],{"class":99,"line":196},[97,2740,1077],{"class":704},[97,2742,1385],{"class":711},[97,2744,2282],{"class":1083},[97,2746,2201],{"class":711},[97,2748,1178],{"class":711},[1390,2750,2752],{"id":2751},"_4-合并冲突","4. 合并冲突",[89,2754,2756],{"className":1062,"code":2755,"language":1064,"meta":48,"style":48},"git status                        # 查看冲突文件\n# 手动编辑冲突文件，删除 \u003C\u003C\u003C\u003C\u003C\u003C\u003C ======= >>>>>>> 标记\ngit add \u003Cresolved-file>\ngit commit                        # 或 git rebase --continue\n",[74,2757,2758,2767,2772,2787],{"__ignoreMap":48},[97,2759,2760,2762,2764],{"class":99,"line":100},[97,2761,1077],{"class":704},[97,2763,1289],{"class":711},[97,2765,2766],{"class":1071},"                        # 查看冲突文件\n",[97,2768,2769],{"class":99,"line":49},[97,2770,2771],{"class":1071},"# 手动编辑冲突文件，删除 \u003C\u003C\u003C\u003C\u003C\u003C\u003C ======= >>>>>>> 标记\n",[97,2773,2774,2776,2778,2780,2783,2785],{"class":99,"line":111},[97,2775,1077],{"class":704},[97,2777,1299],{"class":711},[97,2779,1302],{"class":700},[97,2781,2782],{"class":711},"resolved-fil",[97,2784,1308],{"class":696},[97,2786,720],{"class":700},[97,2788,2789,2791,2793],{"class":99,"line":196},[97,2790,1077],{"class":704},[97,2792,1345],{"class":711},[97,2794,2795],{"class":1071},"                        # 或 git rebase --continue\n",[14,2797,2798],{},"放弃合并：",[89,2800,2802],{"className":1062,"code":2801,"language":1064,"meta":48,"style":48},"git merge --abort\ngit rebase --abort\n",[74,2803,2804,2813],{"__ignoreMap":48},[97,2805,2806,2808,2810],{"class":99,"line":100},[97,2807,1077],{"class":704},[97,2809,1664],{"class":711},[97,2811,2812],{"class":1083}," --abort\n",[97,2814,2815,2817,2819],{"class":99,"line":49},[97,2816,1077],{"class":704},[97,2818,1704],{"class":711},[97,2820,2812],{"class":1083},[1390,2822,2824],{"id":2823},"_5-不小心提交了敏感信息","5. 不小心提交了敏感信息",[14,2826,2827,2828,2831,2832,2835],{},"如果还没推送，",[74,2829,2830],{},"git reset --hard"," 即可。",[2833,2834],"br",{},"\n如果已推送，必须改写历史：",[89,2837,2839],{"className":1062,"code":2838,"language":1064,"meta":48,"style":48},"git filter-repo --path secrets.txt --invert-paths\ngit push --force-with-lease\n",[74,2840,2841,2857],{"__ignoreMap":48},[97,2842,2843,2845,2848,2851,2854],{"class":99,"line":100},[97,2844,1077],{"class":704},[97,2846,2847],{"class":711}," filter-repo",[97,2849,2850],{"class":1083}," --path",[97,2852,2853],{"class":711}," secrets.txt",[97,2855,2856],{"class":1083}," --invert-paths\n",[97,2858,2859,2861,2863],{"class":99,"line":49},[97,2860,1077],{"class":704},[97,2862,1375],{"class":711},[97,2864,2865],{"class":1083}," --force-with-lease\n",[14,2867,2868],{},"同时立即更换泄露的密钥，因为 Git 服务器可能仍留有副本。",[1390,2870,2872],{"id":2871},"_6-忽略文件不生效","6. 忽略文件不生效",[89,2874,2876],{"className":1062,"code":2875,"language":1064,"meta":48,"style":48},"git rm -r --cached .\ngit add .\ngit commit -m \"fix gitignore\"\n",[74,2877,2878,2894,2902],{"__ignoreMap":48},[97,2879,2880,2882,2885,2888,2891],{"class":99,"line":100},[97,2881,1077],{"class":704},[97,2883,2884],{"class":711}," rm",[97,2886,2887],{"class":1083}," -r",[97,2889,2890],{"class":1083}," --cached",[97,2892,2893],{"class":711}," .\n",[97,2895,2896,2898,2900],{"class":99,"line":49},[97,2897,1077],{"class":704},[97,2899,1299],{"class":711},[97,2901,2893],{"class":711},[97,2903,2904,2906,2908,2910],{"class":99,"line":111},[97,2905,1077],{"class":704},[97,2907,1345],{"class":711},[97,2909,1348],{"class":1083},[97,2911,2912],{"class":711}," \"fix gitignore\"\n",[14,2914,2915,2918,2919,21],{},[74,2916,2917],{},".gitignore"," 只对未跟踪文件生效，已跟踪的文件需要先 ",[74,2920,2921],{},"rm --cached",[28,2923,2925],{"id":2924},"十提交规范conventional-commits","十、提交规范（Conventional Commits）",[89,2927,2930],{"className":2928,"code":2929,"language":215},[214],"\u003Ctype>(\u003Cscope>): \u003Csubject>\n\n\u003Cbody>\n\n\u003Cfooter>\n",[74,2931,2929],{"__ignoreMap":48},[14,2933,2934],{},"常用 type：",[356,2936,2937,2945],{},[359,2938,2939],{},[362,2940,2941,2943],{},[365,2942,415],{},[365,2944,373],{},[375,2946,2947,2957,2967,2977,2986,2996,3006,3015],{},[362,2948,2949,2954],{},[380,2950,2951],{},[74,2952,2953],{},"feat",[380,2955,2956],{},"新功能",[362,2958,2959,2964],{},[380,2960,2961],{},[74,2962,2963],{},"fix",[380,2965,2966],{},"修复 bug",[362,2968,2969,2974],{},[380,2970,2971],{},[74,2972,2973],{},"docs",[380,2975,2976],{},"文档变更",[362,2978,2979,2983],{},[380,2980,2981],{},[74,2982,558],{},[380,2984,2985],{},"格式调整（不影响代码逻辑）",[362,2987,2988,2993],{},[380,2989,2990],{},[74,2991,2992],{},"refactor",[380,2994,2995],{},"重构",[362,2997,2998,3003],{},[380,2999,3000],{},[74,3001,3002],{},"perf",[380,3004,3005],{},"性能优化",[362,3007,3008,3012],{},[380,3009,3010],{},[74,3011,60],{},[380,3013,3014],{},"测试相关",[362,3016,3017,3022],{},[380,3018,3019],{},[74,3020,3021],{},"chore",[380,3023,3024],{},"构建 \u002F 工具 \u002F 依赖变更",[14,3026,3027],{},"示例：",[89,3029,3032],{"className":3030,"code":3031,"language":215},[214],"feat(auth): 支持 OAuth 2.0 登录\n\n- 新增 GitHub \u002F Google 登录入口\n- 补充 token 刷新逻辑\n\nCloses #123\n",[74,3033,3031],{"__ignoreMap":48},[28,3035,3037],{"id":3036},"十一实用技巧","十一、实用技巧",[89,3039,3041],{"className":1062,"code":3040,"language":1064,"meta":48,"style":48},"# 快速查看某文件的最后一次修改\ngit log -1 --stat \u003Cfile>\n\n# 查找是哪次提交引入了某个字符串\ngit log -S \"search-string\" --source --all\n\n# 查看两个分支的共同祖先\ngit merge-base main feature\n\n# 比较工作区和某个提交\ngit diff \u003Ccommit>\n\n# 临时切换到某个提交查看，不切分支\ngit switch --detach \u003Ccommit>\n\n# 查看暂存区的具体内容\ngit diff --staged\n\n# 统计每个作者的提交数\ngit shortlog -sn\n\n# 找出未被合并的分支\ngit branch --no-merged\n",[74,3042,3043,3048,3068,3072,3077,3094,3098,3103,3116,3120,3125,3139,3143,3148,3165,3169,3174,3183,3187,3192,3202,3206,3212],{"__ignoreMap":48},[97,3044,3045],{"class":99,"line":100},[97,3046,3047],{"class":1071},"# 快速查看某文件的最后一次修改\n",[97,3049,3050,3052,3054,3057,3060,3062,3064,3066],{"class":99,"line":49},[97,3051,1077],{"class":704},[97,3053,2467],{"class":711},[97,3055,3056],{"class":1083}," -1",[97,3058,3059],{"class":1083}," --stat",[97,3061,1302],{"class":700},[97,3063,1305],{"class":711},[97,3065,1308],{"class":696},[97,3067,720],{"class":700},[97,3069,3070],{"class":99,"line":111},[97,3071,108],{"emptyLinePlaceholder":57},[97,3073,3074],{"class":99,"line":196},[97,3075,3076],{"class":1071},"# 查找是哪次提交引入了某个字符串\n",[97,3078,3079,3081,3083,3085,3088,3091],{"class":99,"line":202},[97,3080,1077],{"class":704},[97,3082,2467],{"class":711},[97,3084,2555],{"class":1083},[97,3086,3087],{"class":711}," \"search-string\"",[97,3089,3090],{"class":1083}," --source",[97,3092,3093],{"class":1083}," --all\n",[97,3095,3096],{"class":99,"line":343},[97,3097,108],{"emptyLinePlaceholder":57},[97,3099,3100],{"class":99,"line":349},[97,3101,3102],{"class":1071},"# 查看两个分支的共同祖先\n",[97,3104,3105,3107,3110,3113],{"class":99,"line":1134},[97,3106,1077],{"class":704},[97,3108,3109],{"class":711}," merge-base",[97,3111,3112],{"class":711}," main",[97,3114,3115],{"class":711}," feature\n",[97,3117,3118],{"class":99,"line":1140},[97,3119,108],{"emptyLinePlaceholder":57},[97,3121,3122],{"class":99,"line":1155},[97,3123,3124],{"class":1071},"# 比较工作区和某个提交\n",[97,3126,3127,3129,3131,3133,3135,3137],{"class":99,"line":1160},[97,3128,1077],{"class":704},[97,3130,1404],{"class":711},[97,3132,1302],{"class":700},[97,3134,2591],{"class":711},[97,3136,2594],{"class":696},[97,3138,720],{"class":700},[97,3140,3141],{"class":99,"line":1166},[97,3142,108],{"emptyLinePlaceholder":57},[97,3144,3145],{"class":99,"line":1181},[97,3146,3147],{"class":1071},"# 临时切换到某个提交查看，不切分支\n",[97,3149,3150,3152,3154,3157,3159,3161,3163],{"class":99,"line":1186},[97,3151,1077],{"class":704},[97,3153,1526],{"class":711},[97,3155,3156],{"class":1083}," --detach",[97,3158,1302],{"class":700},[97,3160,2591],{"class":711},[97,3162,2594],{"class":696},[97,3164,720],{"class":700},[97,3166,3167],{"class":99,"line":1192},[97,3168,108],{"emptyLinePlaceholder":57},[97,3170,3171],{"class":99,"line":1207},[97,3172,3173],{"class":1071},"# 查看暂存区的具体内容\n",[97,3175,3176,3178,3180],{"class":99,"line":1222},[97,3177,1077],{"class":704},[97,3179,1404],{"class":711},[97,3181,3182],{"class":1083}," --staged\n",[97,3184,3185],{"class":99,"line":1237},[97,3186,108],{"emptyLinePlaceholder":57},[97,3188,3189],{"class":99,"line":1252},[97,3190,3191],{"class":1071},"# 统计每个作者的提交数\n",[97,3193,3194,3196,3199],{"class":99,"line":1257},[97,3195,1077],{"class":704},[97,3197,3198],{"class":711}," shortlog",[97,3200,3201],{"class":1083}," -sn\n",[97,3203,3204],{"class":99,"line":1263},[97,3205,108],{"emptyLinePlaceholder":57},[97,3207,3209],{"class":99,"line":3208},22,[97,3210,3211],{"class":1071},"# 找出未被合并的分支\n",[97,3213,3215,3217,3219],{"class":99,"line":3214},23,[97,3216,1077],{"class":704},[97,3218,1474],{"class":711},[97,3220,3221],{"class":1083}," --no-merged\n",[28,3223,3225],{"id":3224},"十二配置文件位置","十二、配置文件位置",[356,3227,3228,3238],{},[359,3229,3230],{},[362,3231,3232,3235],{},[365,3233,3234],{},"级别",[365,3236,3237],{},"路径",[375,3239,3240,3255,3268],{},[362,3241,3242,3245],{},[380,3243,3244],{},"系统",[380,3246,3247,3250,3251,3254],{},[74,3248,3249],{},"\u002Fetc\u002Fgitconfig","（Linux）\u002F ",[74,3252,3253],{},"C:\\Program Files\\Git\\etc\\gitconfig","（Windows）",[362,3256,3257,3260],{},[380,3258,3259],{},"全局",[380,3261,3262,423,3265],{},[74,3263,3264],{},"~\u002F.gitconfig",[74,3266,3267],{},"%USERPROFILE%\\.gitconfig",[362,3269,3270,3273],{},[380,3271,3272],{},"仓库",[380,3274,3275],{},[74,3276,3277],{},"\u003Crepo>\u002F.git\u002Fconfig",[14,3279,3280],{},"优先级：仓库 > 全局 > 系统。",[959,3282],{},[28,3284,3285],{"id":3285},"参考",[32,3287,3288,3297,3304],{},[35,3289,3290,3291],{},"官方文档：",[972,3292,3293],{"href":3293,"rel":3294,"target":975},"https:\u002F\u002Fgit-scm.com\u002Fdocs",[3295,977,3296],"nofollow","noreferrer",[35,3298,3299,3300],{},"Pro Git（中文版）：",[972,3301,3302],{"href":3302,"rel":3303,"target":975},"https:\u002F\u002Fgit-scm.com\u002Fbook\u002Fzh\u002Fv2",[3295,977,3296],[35,3305,3306,3307],{},"Conventional Commits：",[972,3308,3309],{"href":3309,"rel":3310,"target":975},"https:\u002F\u002Fwww.conventionalcommits.org\u002Fzh-hans\u002F",[3295,977,3296],[558,3312,3313],{},"html pre.shiki code .snpHw, html code.shiki .snpHw{--shiki-default:#88846F}html pre.shiki code .sHkqI, html code.shiki .sHkqI{--shiki-default:#A6E22E}html pre.shiki code .s_Ekj, html code.shiki .s_Ekj{--shiki-default:#E6DB74}html pre.shiki code .s7s5_, html code.shiki .s7s5_{--shiki-default:#AE81FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .s8I7P, html code.shiki .s8I7P{--shiki-default:#F92672}html pre.shiki code .sCdxs, html code.shiki .sCdxs{--shiki-default:#F8F8F2}",{"title":48,"searchDepth":49,"depth":49,"links":3315},[3316,3317,3320,3323,3329,3330,3331,3332,3333,3341,3342,3343,3344],{"id":1058,"depth":49,"text":1059},{"id":1276,"depth":49,"text":1277,"children":3318},[3319],{"id":1392,"depth":111,"text":1392},{"id":1461,"depth":49,"text":1462,"children":3321},[3322],{"id":1652,"depth":111,"text":1652},{"id":1741,"depth":49,"text":1742,"children":3324},[3325,3326,3327,3328],{"id":1816,"depth":111,"text":1816},{"id":1873,"depth":111,"text":1873},{"id":1920,"depth":111,"text":1920},{"id":2014,"depth":111,"text":2014},{"id":2062,"depth":49,"text":2063},{"id":2171,"depth":49,"text":2172},{"id":2353,"depth":49,"text":2354},{"id":2454,"depth":49,"text":2455},{"id":2602,"depth":49,"text":2603,"children":3334},[3335,3336,3337,3338,3339,3340],{"id":2606,"depth":111,"text":2607},{"id":2657,"depth":111,"text":2658},{"id":2707,"depth":111,"text":2708},{"id":2751,"depth":111,"text":2752},{"id":2823,"depth":111,"text":2824},{"id":2871,"depth":111,"text":2872},{"id":2924,"depth":49,"text":2925},{"id":3036,"depth":49,"text":3037},{"id":3224,"depth":49,"text":3225},{"id":3285,"depth":49,"text":3285},"2026-09-25",{},"\u002Fgit-memo-2026-09-25",{"title":1050,"description":1055},"git-memo-2026-09-25",[3351,3352],"Git","备忘录","0H9pi2QAc8Lw_Eh4bdHwdkFMYOEf4495Ze_IMkWMpDk",{"id":3355,"title":3356,"author":8,"body":3357,"cover":582,"date":3345,"description":3361,"extension":55,"meta":8985,"navigation":57,"path":8986,"seo":8987,"stem":8988,"tags":8989,"__hash__":8992},"content\u002Flinux-memo-2026-09-25.md","Linux 备忘录",{"type":11,"value":3358,"toc":8937},[3359,3362,3366,3370,3373,3430,3440,3463,3473,3477,3541,3545,3647,3653,3731,3736,3781,3785,3792,3798,3801,3858,3862,3956,3959,4017,4021,4026,4085,4133,4138,4142,4172,4176,4181,4223,4227,4307,4311,4503,4506,4658,4662,5043,5046,5113,5117,5224,5227,5273,5290,5293,5352,5356,5555,5558,5616,5620,5945,5948,6085,6089,6219,6222,6270,6274,6458,6462,6657,6660,6669,6675,6679,6842,6848,6923,6951,6955,7063,7068,7074,7080,7083,7201,7205,7209,7403,7407,7609,7613,7697,7701,7822,7826,7972,7976,8045,8048,8084,8087,8226,8230,8263,8266,8272,8274,8280,8283,8297,8301,8505,8508,8579,8582,8773,8777,8887,8889,8891,8934],[14,3360,3361],{},"国内环境下的高频命令。换源和镜像放在最前面。",[28,3363,3365],{"id":3364},"一换源","一、换源",[1390,3367,3369],{"id":3368},"_11-aptdebian-ubuntu","1.1 apt（Debian \u002F Ubuntu）",[14,3371,3372],{},"先备份，再替换：",[89,3374,3376],{"className":1062,"code":3375,"language":1064,"meta":48,"style":48},"sudo cp \u002Fetc\u002Fapt\u002Fsources.list \u002Fetc\u002Fapt\u002Fsources.list.bak\nsudo sed -i 's|http:\u002F\u002Farchive.ubuntu.com|https:\u002F\u002Fmirrors.tuna.tsinghua.edu.cn|g' \u002Fetc\u002Fapt\u002Fsources.list\nsudo sed -i 's|http:\u002F\u002Fsecurity.ubuntu.com|https:\u002F\u002Fmirrors.tuna.tsinghua.edu.cn|g' \u002Fetc\u002Fapt\u002Fsources.list\nsudo apt update\n",[74,3377,3378,3392,3407,3420],{"__ignoreMap":48},[97,3379,3380,3383,3386,3389],{"class":99,"line":100},[97,3381,3382],{"class":704},"sudo",[97,3384,3385],{"class":711}," cp",[97,3387,3388],{"class":711}," \u002Fetc\u002Fapt\u002Fsources.list",[97,3390,3391],{"class":711}," \u002Fetc\u002Fapt\u002Fsources.list.bak\n",[97,3393,3394,3396,3399,3401,3404],{"class":99,"line":49},[97,3395,3382],{"class":704},[97,3397,3398],{"class":711}," sed",[97,3400,1724],{"class":1083},[97,3402,3403],{"class":711}," 's|http:\u002F\u002Farchive.ubuntu.com|https:\u002F\u002Fmirrors.tuna.tsinghua.edu.cn|g'",[97,3405,3406],{"class":711}," \u002Fetc\u002Fapt\u002Fsources.list\n",[97,3408,3409,3411,3413,3415,3418],{"class":99,"line":111},[97,3410,3382],{"class":704},[97,3412,3398],{"class":711},[97,3414,1724],{"class":1083},[97,3416,3417],{"class":711}," 's|http:\u002F\u002Fsecurity.ubuntu.com|https:\u002F\u002Fmirrors.tuna.tsinghua.edu.cn|g'",[97,3419,3406],{"class":711},[97,3421,3422,3424,3427],{"class":99,"line":196},[97,3423,3382],{"class":704},[97,3425,3426],{"class":711}," apt",[97,3428,3429],{"class":711}," update\n",[14,3431,3432,3435,3436,3439],{},[18,3433,3434],{},"Ubuntu 24.04+"," 使用新格式 ",[74,3437,3438],{},"\u002Fetc\u002Fapt\u002Fsources.list.d\u002Fubuntu.sources","：",[89,3441,3443],{"className":1062,"code":3442,"language":1064,"meta":48,"style":48},"sudo sed -i 's|http:\u002F\u002Farchive.ubuntu.com|https:\u002F\u002Fmirrors.tuna.tsinghua.edu.cn|g' \\\n  \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fubuntu.sources\n",[74,3444,3445,3458],{"__ignoreMap":48},[97,3446,3447,3449,3451,3453,3455],{"class":99,"line":100},[97,3448,3382],{"class":704},[97,3450,3398],{"class":711},[97,3452,1724],{"class":1083},[97,3454,3403],{"class":711},[97,3456,3457],{"class":1083}," \\\n",[97,3459,3460],{"class":99,"line":49},[97,3461,3462],{"class":711},"  \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fubuntu.sources\n",[14,3464,3465,3468,3469,3472],{},[18,3466,3467],{},"Debian 12+"," 使用 ",[74,3470,3471],{},"\u002Fetc\u002Fapt\u002Fsources.list.d\u002Fdebian.sources","，同理。",[1390,3474,3476],{"id":3475},"_12-常用-apt-镜像源","1.2 常用 apt 镜像源",[356,3478,3479,3489],{},[359,3480,3481],{},[362,3482,3483,3486],{},[365,3484,3485],{},"源",[365,3487,3488],{},"URL",[375,3490,3491,3501,3511,3521,3531],{},[362,3492,3493,3496],{},[380,3494,3495],{},"清华",[380,3497,3498],{},[74,3499,3500],{},"https:\u002F\u002Fmirrors.tuna.tsinghua.edu.cn",[362,3502,3503,3506],{},[380,3504,3505],{},"阿里云",[380,3507,3508],{},[74,3509,3510],{},"https:\u002F\u002Fmirrors.aliyun.com",[362,3512,3513,3516],{},[380,3514,3515],{},"中科大",[380,3517,3518],{},[74,3519,3520],{},"https:\u002F\u002Fmirrors.ustc.edu.cn",[362,3522,3523,3526],{},[380,3524,3525],{},"华为云",[380,3527,3528],{},[74,3529,3530],{},"https:\u002F\u002Fmirrors.huaweicloud.com",[362,3532,3533,3536],{},[380,3534,3535],{},"网易",[380,3537,3538],{},[74,3539,3540],{},"https:\u002F\u002Fmirrors.163.com",[1390,3542,3544],{"id":3543},"_13-yum-dnfrhel-centos-fedora","1.3 yum \u002F dnf（RHEL \u002F CentOS \u002F Fedora）",[89,3546,3548],{"className":1062,"code":3547,"language":1064,"meta":48,"style":48},"# 备份\nsudo cp -r \u002Fetc\u002Fyum.repos.d \u002Fetc\u002Fyum.repos.d.bak\n\n# CentOS 7 换阿里云\nsudo sed -i 's|mirrorlist=|#mirrorlist=|g' \u002Fetc\u002Fyum.repos.d\u002FCentOS-*.repo\nsudo sed -i 's|#baseurl=http:\u002F\u002Fmirror.centos.org|baseurl=https:\u002F\u002Fmirrors.aliyun.com|g' \\\n  \u002Fetc\u002Fyum.repos.d\u002FCentOS-*.repo\n\nsudo yum clean all\nsudo yum makecache\n",[74,3549,3550,3555,3569,3573,3578,3599,3612,3621,3625,3638],{"__ignoreMap":48},[97,3551,3552],{"class":99,"line":100},[97,3553,3554],{"class":1071},"# 备份\n",[97,3556,3557,3559,3561,3563,3566],{"class":99,"line":49},[97,3558,3382],{"class":704},[97,3560,3385],{"class":711},[97,3562,2887],{"class":1083},[97,3564,3565],{"class":711}," \u002Fetc\u002Fyum.repos.d",[97,3567,3568],{"class":711}," \u002Fetc\u002Fyum.repos.d.bak\n",[97,3570,3571],{"class":99,"line":111},[97,3572,108],{"emptyLinePlaceholder":57},[97,3574,3575],{"class":99,"line":196},[97,3576,3577],{"class":1071},"# CentOS 7 换阿里云\n",[97,3579,3580,3582,3584,3586,3589,3592,3596],{"class":99,"line":202},[97,3581,3382],{"class":704},[97,3583,3398],{"class":711},[97,3585,1724],{"class":1083},[97,3587,3588],{"class":711}," 's|mirrorlist=|#mirrorlist=|g'",[97,3590,3591],{"class":711}," \u002Fetc\u002Fyum.repos.d\u002FCentOS-",[97,3593,3595],{"class":3594},"szGx7","*",[97,3597,3598],{"class":711},".repo\n",[97,3600,3601,3603,3605,3607,3610],{"class":99,"line":343},[97,3602,3382],{"class":704},[97,3604,3398],{"class":711},[97,3606,1724],{"class":1083},[97,3608,3609],{"class":711}," 's|#baseurl=http:\u002F\u002Fmirror.centos.org|baseurl=https:\u002F\u002Fmirrors.aliyun.com|g'",[97,3611,3457],{"class":1083},[97,3613,3614,3617,3619],{"class":99,"line":349},[97,3615,3616],{"class":711},"  \u002Fetc\u002Fyum.repos.d\u002FCentOS-",[97,3618,3595],{"class":3594},[97,3620,3598],{"class":711},[97,3622,3623],{"class":99,"line":1134},[97,3624,108],{"emptyLinePlaceholder":57},[97,3626,3627,3629,3632,3635],{"class":99,"line":1140},[97,3628,3382],{"class":704},[97,3630,3631],{"class":711}," yum",[97,3633,3634],{"class":711}," clean",[97,3636,3637],{"class":711}," all\n",[97,3639,3640,3642,3644],{"class":99,"line":1155},[97,3641,3382],{"class":704},[97,3643,3631],{"class":711},[97,3645,3646],{"class":711}," makecache\n",[14,3648,3649,3652],{},[18,3650,3651],{},"CentOS 8 \u002F Stream"," 需要先换 vault（官方源已下线）：",[89,3654,3656],{"className":1062,"code":3655,"language":1064,"meta":48,"style":48},"sudo sed -i 's|mirror.centos.org|mirrors.aliyun.com|g' \u002Fetc\u002Fyum.repos.d\u002F*.repo\nsudo sed -i 's|^#baseurl|baseurl|g' \u002Fetc\u002Fyum.repos.d\u002F*.repo\nsudo sed -i 's|^mirrorlist|#mirrorlist|g' \u002Fetc\u002Fyum.repos.d\u002F*.repo\nsudo dnf clean all && sudo dnf makecache\n",[74,3657,3658,3676,3693,3710],{"__ignoreMap":48},[97,3659,3660,3662,3664,3666,3669,3672,3674],{"class":99,"line":100},[97,3661,3382],{"class":704},[97,3663,3398],{"class":711},[97,3665,1724],{"class":1083},[97,3667,3668],{"class":711}," 's|mirror.centos.org|mirrors.aliyun.com|g'",[97,3670,3671],{"class":711}," \u002Fetc\u002Fyum.repos.d\u002F",[97,3673,3595],{"class":3594},[97,3675,3598],{"class":711},[97,3677,3678,3680,3682,3684,3687,3689,3691],{"class":99,"line":49},[97,3679,3382],{"class":704},[97,3681,3398],{"class":711},[97,3683,1724],{"class":1083},[97,3685,3686],{"class":711}," 's|^#baseurl|baseurl|g'",[97,3688,3671],{"class":711},[97,3690,3595],{"class":3594},[97,3692,3598],{"class":711},[97,3694,3695,3697,3699,3701,3704,3706,3708],{"class":99,"line":111},[97,3696,3382],{"class":704},[97,3698,3398],{"class":711},[97,3700,1724],{"class":1083},[97,3702,3703],{"class":711}," 's|^mirrorlist|#mirrorlist|g'",[97,3705,3671],{"class":711},[97,3707,3595],{"class":3594},[97,3709,3598],{"class":711},[97,3711,3712,3714,3717,3719,3722,3725,3727,3729],{"class":99,"line":196},[97,3713,3382],{"class":704},[97,3715,3716],{"class":711}," dnf",[97,3718,3634],{"class":711},[97,3720,3721],{"class":711}," all",[97,3723,3724],{"class":696}," && ",[97,3726,3382],{"class":704},[97,3728,3716],{"class":711},[97,3730,3646],{"class":711},[14,3732,3733,3439],{},[18,3734,3735],{},"Fedora",[89,3737,3739],{"className":1062,"code":3738,"language":1064,"meta":48,"style":48},"sudo sed -i 's|^metalink=|#metalink=|g' \u002Fetc\u002Fyum.repos.d\u002Ffedora*.repo\nsudo sed -i 's|^#baseurl=http:\u002F\u002Fdownload.example\u002Fpub\u002Ffedora\u002Flinux|baseurl=https:\u002F\u002Fmirrors.tuna.tsinghua.edu.cn\u002Ffedora|g' \\\n  \u002Fetc\u002Fyum.repos.d\u002Ffedora*.repo\n",[74,3740,3741,3759,3772],{"__ignoreMap":48},[97,3742,3743,3745,3747,3749,3752,3755,3757],{"class":99,"line":100},[97,3744,3382],{"class":704},[97,3746,3398],{"class":711},[97,3748,1724],{"class":1083},[97,3750,3751],{"class":711}," 's|^metalink=|#metalink=|g'",[97,3753,3754],{"class":711}," \u002Fetc\u002Fyum.repos.d\u002Ffedora",[97,3756,3595],{"class":3594},[97,3758,3598],{"class":711},[97,3760,3761,3763,3765,3767,3770],{"class":99,"line":49},[97,3762,3382],{"class":704},[97,3764,3398],{"class":711},[97,3766,1724],{"class":1083},[97,3768,3769],{"class":711}," 's|^#baseurl=http:\u002F\u002Fdownload.example\u002Fpub\u002Ffedora\u002Flinux|baseurl=https:\u002F\u002Fmirrors.tuna.tsinghua.edu.cn\u002Ffedora|g'",[97,3771,3457],{"class":1083},[97,3773,3774,3777,3779],{"class":99,"line":111},[97,3775,3776],{"class":711},"  \u002Fetc\u002Fyum.repos.d\u002Ffedora",[97,3778,3595],{"class":3594},[97,3780,3598],{"class":711},[1390,3782,3784],{"id":3783},"_14-pacmanarch","1.4 pacman（Arch）",[14,3786,3787,3788,3791],{},"编辑 ",[74,3789,3790],{},"\u002Fetc\u002Fpacman.d\u002Fmirrorlist","，把国内源放前面：",[89,3793,3796],{"className":3794,"code":3795,"language":215},[214],"Server = https:\u002F\u002Fmirrors.tuna.tsinghua.edu.cn\u002Farchlinux\u002F$repo\u002Fos\u002F$arch\nServer = https:\u002F\u002Fmirrors.ustc.edu.cn\u002Farchlinux\u002F$repo\u002Fos\u002F$arch\n",[74,3797,3795],{"__ignoreMap":48},[14,3799,3800],{},"或者一键：",[89,3802,3804],{"className":1062,"code":3803,"language":1064,"meta":48,"style":48},"sudo pacman -S reflector\nsudo reflector --country China --latest 5 --sort rate --save \u002Fetc\u002Fpacman.d\u002Fmirrorlist\nsudo pacman -Syyu\n",[74,3805,3806,3818,3849],{"__ignoreMap":48},[97,3807,3808,3810,3813,3815],{"class":99,"line":100},[97,3809,3382],{"class":704},[97,3811,3812],{"class":711}," pacman",[97,3814,2555],{"class":1083},[97,3816,3817],{"class":711}," reflector\n",[97,3819,3820,3822,3825,3828,3831,3834,3837,3840,3843,3846],{"class":99,"line":49},[97,3821,3382],{"class":704},[97,3823,3824],{"class":711}," reflector",[97,3826,3827],{"class":1083}," --country",[97,3829,3830],{"class":711}," China",[97,3832,3833],{"class":1083}," --latest",[97,3835,3836],{"class":1083}," 5",[97,3838,3839],{"class":1083}," --sort",[97,3841,3842],{"class":711}," rate",[97,3844,3845],{"class":1083}," --save",[97,3847,3848],{"class":711}," \u002Fetc\u002Fpacman.d\u002Fmirrorlist\n",[97,3850,3851,3853,3855],{"class":99,"line":111},[97,3852,3382],{"class":704},[97,3854,3812],{"class":711},[97,3856,3857],{"class":1083}," -Syyu\n",[1390,3859,3861],{"id":3860},"_15-pip-换源","1.5 pip 换源",[89,3863,3865],{"className":1062,"code":3864,"language":1064,"meta":48,"style":48},"# 永久\npip config set global.index-url https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple\npip config set global.trusted-host pypi.tuna.tsinghua.edu.cn\n\n# 或写入 ~\u002F.pip\u002Fpip.conf (Linux) \u002F %APPDATA%\\pip\\pip.ini (Windows)\n# [global]\n# index-url = https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple\n# trusted-host = pypi.tuna.tsinghua.edu.cn\n\n# 一次性\npip install \u003Cpkg> -i https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple\n",[74,3866,3867,3872,3888,3902,3906,3911,3916,3921,3926,3930,3935],{"__ignoreMap":48},[97,3868,3869],{"class":99,"line":100},[97,3870,3871],{"class":1071},"# 永久\n",[97,3873,3874,3877,3879,3882,3885],{"class":99,"line":49},[97,3875,3876],{"class":704},"pip",[97,3878,1080],{"class":711},[97,3880,3881],{"class":711}," set",[97,3883,3884],{"class":711}," global.index-url",[97,3886,3887],{"class":711}," https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple\n",[97,3889,3890,3892,3894,3896,3899],{"class":99,"line":111},[97,3891,3876],{"class":704},[97,3893,1080],{"class":711},[97,3895,3881],{"class":711},[97,3897,3898],{"class":711}," global.trusted-host",[97,3900,3901],{"class":711}," pypi.tuna.tsinghua.edu.cn\n",[97,3903,3904],{"class":99,"line":196},[97,3905,108],{"emptyLinePlaceholder":57},[97,3907,3908],{"class":99,"line":202},[97,3909,3910],{"class":1071},"# 或写入 ~\u002F.pip\u002Fpip.conf (Linux) \u002F %APPDATA%\\pip\\pip.ini (Windows)\n",[97,3912,3913],{"class":99,"line":343},[97,3914,3915],{"class":1071},"# [global]\n",[97,3917,3918],{"class":99,"line":349},[97,3919,3920],{"class":1071},"# index-url = https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple\n",[97,3922,3923],{"class":99,"line":1134},[97,3924,3925],{"class":1071},"# trusted-host = pypi.tuna.tsinghua.edu.cn\n",[97,3927,3928],{"class":99,"line":1140},[97,3929,108],{"emptyLinePlaceholder":57},[97,3931,3932],{"class":99,"line":1155},[97,3933,3934],{"class":1071},"# 一次性\n",[97,3936,3937,3939,3942,3944,3947,3950,3952,3954],{"class":99,"line":1160},[97,3938,3876],{"class":704},[97,3940,3941],{"class":711}," install",[97,3943,1302],{"class":700},[97,3945,3946],{"class":711},"pk",[97,3948,3949],{"class":696},"g",[97,3951,1311],{"class":700},[97,3953,1724],{"class":1083},[97,3955,3887],{"class":711},[14,3957,3958],{},"常用 pip 镜像：",[356,3960,3961,3969],{},[359,3962,3963],{},[362,3964,3965,3967],{},[365,3966,3485],{},[365,3968,3488],{},[375,3970,3971,3980,3989,3998,4008],{},[362,3972,3973,3975],{},[380,3974,3495],{},[380,3976,3977],{},[74,3978,3979],{},"https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple",[362,3981,3982,3984],{},[380,3983,3505],{},[380,3985,3986],{},[74,3987,3988],{},"https:\u002F\u002Fmirrors.aliyun.com\u002Fpypi\u002Fsimple\u002F",[362,3990,3991,3993],{},[380,3992,3515],{},[380,3994,3995],{},[74,3996,3997],{},"https:\u002F\u002Fpypi.mirrors.ustc.edu.cn\u002Fsimple\u002F",[362,3999,4000,4003],{},[380,4001,4002],{},"豆瓣",[380,4004,4005],{},[74,4006,4007],{},"https:\u002F\u002Fpypi.douban.com\u002Fsimple\u002F",[362,4009,4010,4012],{},[380,4011,3525],{},[380,4013,4014],{},[74,4015,4016],{},"https:\u002F\u002Fmirrors.huaweicloud.com\u002Frepository\u002Fpypi\u002Fsimple\u002F",[1390,4018,4020],{"id":4019},"_16-docker-镜像加速","1.6 Docker 镜像加速",[14,4022,3787,4023,3439],{},[74,4024,4025],{},"\u002Fetc\u002Fdocker\u002Fdaemon.json",[89,4027,4031],{"className":4028,"code":4029,"language":4030,"meta":48,"style":48},"language-json shiki shiki-themes monokai","{\n  \"registry-mirrors\": [\n    \"https:\u002F\u002Fdocker.m.daocloud.io\",\n    \"https:\u002F\u002Fdockerproxy.com\",\n    \"https:\u002F\u002Fmirror.baidubce.com\",\n    \"https:\u002F\u002Fccr.ccs.tencentyun.com\"\n  ]\n}\n","json",[74,4032,4033,4038,4047,4056,4063,4070,4075,4080],{"__ignoreMap":48},[97,4034,4035],{"class":99,"line":100},[97,4036,4037],{"class":696},"{\n",[97,4039,4040,4044],{"class":99,"line":49},[97,4041,4043],{"class":4042},"sOx1s","  \"registry-mirrors\"",[97,4045,4046],{"class":696},": [\n",[97,4048,4049,4053],{"class":99,"line":111},[97,4050,4052],{"class":4051},"susgL","    \"https:\u002F\u002Fdocker.m.daocloud.io\"",[97,4054,4055],{"class":696},",\n",[97,4057,4058,4061],{"class":99,"line":196},[97,4059,4060],{"class":4051},"    \"https:\u002F\u002Fdockerproxy.com\"",[97,4062,4055],{"class":696},[97,4064,4065,4068],{"class":99,"line":202},[97,4066,4067],{"class":4051},"    \"https:\u002F\u002Fmirror.baidubce.com\"",[97,4069,4055],{"class":696},[97,4071,4072],{"class":99,"line":343},[97,4073,4074],{"class":4051},"    \"https:\u002F\u002Fccr.ccs.tencentyun.com\"\n",[97,4076,4077],{"class":99,"line":349},[97,4078,4079],{"class":696},"  ]\n",[97,4081,4082],{"class":99,"line":1134},[97,4083,4084],{"class":696},"}\n",[89,4086,4088],{"className":1062,"code":4087,"language":1064,"meta":48,"style":48},"sudo systemctl daemon-reload\nsudo systemctl restart docker\ndocker info | grep -A 5 \"Registry Mirrors\"\n",[74,4089,4090,4100,4112],{"__ignoreMap":48},[97,4091,4092,4094,4097],{"class":99,"line":100},[97,4093,3382],{"class":704},[97,4095,4096],{"class":711}," systemctl",[97,4098,4099],{"class":711}," daemon-reload\n",[97,4101,4102,4104,4106,4109],{"class":99,"line":49},[97,4103,3382],{"class":704},[97,4105,4096],{"class":711},[97,4107,4108],{"class":711}," restart",[97,4110,4111],{"class":711}," docker\n",[97,4113,4114,4117,4120,4123,4126,4128,4130],{"class":99,"line":111},[97,4115,4116],{"class":704},"docker",[97,4118,4119],{"class":711}," info",[97,4121,4122],{"class":700}," |",[97,4124,4125],{"class":704}," grep",[97,4127,1335],{"class":1083},[97,4129,3836],{"class":1083},[97,4131,4132],{"class":711}," \"Registry Mirrors\"\n",[42,4134,4135],{},[14,4136,4137],{},"2024 年后很多公共镜像源已停服，以上仅供参考。企业环境建议自建 Harbor 或使用阿里云\u002F腾讯云容器镜像服务。",[1390,4139,4141],{"id":4140},"_17-go-module-代理","1.7 Go module 代理",[89,4143,4145],{"className":1062,"code":4144,"language":1064,"meta":48,"style":48},"go env -w GOPROXY=https:\u002F\u002Fgoproxy.cn,direct\ngo env -w GOSUMDB=sum.golang.google.cn\n",[74,4146,4147,4161],{"__ignoreMap":48},[97,4148,4149,4152,4155,4158],{"class":99,"line":100},[97,4150,4151],{"class":704},"go",[97,4153,4154],{"class":711}," env",[97,4156,4157],{"class":1083}," -w",[97,4159,4160],{"class":711}," GOPROXY=https:\u002F\u002Fgoproxy.cn,direct\n",[97,4162,4163,4165,4167,4169],{"class":99,"line":49},[97,4164,4151],{"class":704},[97,4166,4154],{"class":711},[97,4168,4157],{"class":1083},[97,4170,4171],{"class":711}," GOSUMDB=sum.golang.google.cn\n",[1390,4173,4175],{"id":4174},"_18-maven-换源","1.8 Maven 换源",[14,4177,3787,4178,3439],{},[74,4179,4180],{},"~\u002F.m2\u002Fsettings.xml",[89,4182,4186],{"className":4183,"code":4184,"language":4185,"meta":48,"style":48},"language-xml shiki shiki-themes monokai","\u003Cmirrors>\n  \u003Cmirror>\n    \u003Cid>aliyun\u003C\u002Fid>\n    \u003CmirrorOf>central\u003C\u002FmirrorOf>\n    \u003Curl>https:\u002F\u002Fmaven.aliyun.com\u002Frepository\u002Fpublic\u003C\u002Furl>\n  \u003C\u002Fmirror>\n\u003C\u002Fmirrors>\n","xml",[74,4187,4188,4193,4198,4203,4208,4213,4218],{"__ignoreMap":48},[97,4189,4190],{"class":99,"line":100},[97,4191,4192],{},"\u003Cmirrors>\n",[97,4194,4195],{"class":99,"line":49},[97,4196,4197],{},"  \u003Cmirror>\n",[97,4199,4200],{"class":99,"line":111},[97,4201,4202],{},"    \u003Cid>aliyun\u003C\u002Fid>\n",[97,4204,4205],{"class":99,"line":196},[97,4206,4207],{},"    \u003CmirrorOf>central\u003C\u002FmirrorOf>\n",[97,4209,4210],{"class":99,"line":202},[97,4211,4212],{},"    \u003Curl>https:\u002F\u002Fmaven.aliyun.com\u002Frepository\u002Fpublic\u003C\u002Furl>\n",[97,4214,4215],{"class":99,"line":343},[97,4216,4217],{},"  \u003C\u002Fmirror>\n",[97,4219,4220],{"class":99,"line":349},[97,4221,4222],{},"\u003C\u002Fmirrors>\n",[1390,4224,4226],{"id":4225},"_19-换源后必做","1.9 换源后必做",[89,4228,4230],{"className":1062,"code":4229,"language":1064,"meta":48,"style":48},"# apt\nsudo apt update\n\n# yum \u002F dnf\nsudo yum clean all && sudo yum makecache\nsudo dnf clean all && sudo dnf makecache\n\n# pacman\nsudo pacman -Syyu\n",[74,4231,4232,4237,4245,4249,4254,4272,4290,4294,4299],{"__ignoreMap":48},[97,4233,4234],{"class":99,"line":100},[97,4235,4236],{"class":1071},"# apt\n",[97,4238,4239,4241,4243],{"class":99,"line":49},[97,4240,3382],{"class":704},[97,4242,3426],{"class":711},[97,4244,3429],{"class":711},[97,4246,4247],{"class":99,"line":111},[97,4248,108],{"emptyLinePlaceholder":57},[97,4250,4251],{"class":99,"line":196},[97,4252,4253],{"class":1071},"# yum \u002F dnf\n",[97,4255,4256,4258,4260,4262,4264,4266,4268,4270],{"class":99,"line":202},[97,4257,3382],{"class":704},[97,4259,3631],{"class":711},[97,4261,3634],{"class":711},[97,4263,3721],{"class":711},[97,4265,3724],{"class":696},[97,4267,3382],{"class":704},[97,4269,3631],{"class":711},[97,4271,3646],{"class":711},[97,4273,4274,4276,4278,4280,4282,4284,4286,4288],{"class":99,"line":343},[97,4275,3382],{"class":704},[97,4277,3716],{"class":711},[97,4279,3634],{"class":711},[97,4281,3721],{"class":711},[97,4283,3724],{"class":696},[97,4285,3382],{"class":704},[97,4287,3716],{"class":711},[97,4289,3646],{"class":711},[97,4291,4292],{"class":99,"line":349},[97,4293,108],{"emptyLinePlaceholder":57},[97,4295,4296],{"class":99,"line":1134},[97,4297,4298],{"class":1071},"# pacman\n",[97,4300,4301,4303,4305],{"class":99,"line":1140},[97,4302,3382],{"class":704},[97,4304,3812],{"class":711},[97,4306,3857],{"class":1083},[28,4308,4310],{"id":4309},"二文件与目录","二、文件与目录",[89,4312,4314],{"className":1062,"code":4313,"language":1064,"meta":48,"style":48},"pwd                               # 当前目录\nls -alh                           # 详细列表\ncd -                              # 上一个目录\nmkdir -p a\u002Fb\u002Fc                    # 递归创建\nrm -rf \u003Cdir>                      # 递归删除（危险）\ncp -r \u003Csrc> \u003Cdst>                 # 递归复制\nmv \u003Csrc> \u003Cdst>                    # 移动 \u002F 重命名\nln -s \u003Ctarget> \u003Clink>             # 软链接\ntouch \u003Cfile>\nstat \u003Cfile>\nfile \u003Cfile>\n",[74,4315,4316,4325,4336,4347,4360,4381,4410,4434,4464,4477,4490],{"__ignoreMap":48},[97,4317,4318,4322],{"class":99,"line":100},[97,4319,4321],{"class":4320},"sYf5A","pwd",[97,4323,4324],{"class":1071},"                               # 当前目录\n",[97,4326,4327,4330,4333],{"class":99,"line":49},[97,4328,4329],{"class":704},"ls",[97,4331,4332],{"class":1083}," -alh",[97,4334,4335],{"class":1071},"                           # 详细列表\n",[97,4337,4338,4341,4344],{"class":99,"line":111},[97,4339,4340],{"class":4320},"cd",[97,4342,4343],{"class":711}," -",[97,4345,4346],{"class":1071},"                              # 上一个目录\n",[97,4348,4349,4352,4354,4357],{"class":99,"line":196},[97,4350,4351],{"class":704},"mkdir",[97,4353,2505],{"class":1083},[97,4355,4356],{"class":711}," a\u002Fb\u002Fc",[97,4358,4359],{"class":1071},"                    # 递归创建\n",[97,4361,4362,4365,4368,4370,4373,4376,4378],{"class":99,"line":202},[97,4363,4364],{"class":704},"rm",[97,4366,4367],{"class":1083}," -rf",[97,4369,1302],{"class":700},[97,4371,4372],{"class":711},"di",[97,4374,4375],{"class":696},"r",[97,4377,1311],{"class":700},[97,4379,4380],{"class":1071},"                      # 递归删除（危险）\n",[97,4382,4383,4386,4388,4390,4393,4396,4398,4400,4403,4405,4407],{"class":99,"line":343},[97,4384,4385],{"class":704},"cp",[97,4387,2887],{"class":1083},[97,4389,1302],{"class":700},[97,4391,4392],{"class":711},"sr",[97,4394,4395],{"class":696},"c",[97,4397,1311],{"class":700},[97,4399,1302],{"class":700},[97,4401,4402],{"class":711},"ds",[97,4404,2594],{"class":696},[97,4406,1311],{"class":700},[97,4408,4409],{"class":1071},"                 # 递归复制\n",[97,4411,4412,4415,4417,4419,4421,4423,4425,4427,4429,4431],{"class":99,"line":349},[97,4413,4414],{"class":704},"mv",[97,4416,1302],{"class":700},[97,4418,4392],{"class":711},[97,4420,4395],{"class":696},[97,4422,1311],{"class":700},[97,4424,1302],{"class":700},[97,4426,4402],{"class":711},[97,4428,2594],{"class":696},[97,4430,1311],{"class":700},[97,4432,4433],{"class":1071},"                    # 移动 \u002F 重命名\n",[97,4435,4436,4439,4442,4444,4447,4449,4451,4453,4456,4459,4461],{"class":99,"line":1134},[97,4437,4438],{"class":704},"ln",[97,4440,4441],{"class":1083}," -s",[97,4443,1302],{"class":700},[97,4445,4446],{"class":711},"targe",[97,4448,2594],{"class":696},[97,4450,1311],{"class":700},[97,4452,1302],{"class":700},[97,4454,4455],{"class":711},"lin",[97,4457,4458],{"class":696},"k",[97,4460,1311],{"class":700},[97,4462,4463],{"class":1071},"             # 软链接\n",[97,4465,4466,4469,4471,4473,4475],{"class":99,"line":1140},[97,4467,4468],{"class":704},"touch",[97,4470,1302],{"class":700},[97,4472,1305],{"class":711},[97,4474,1308],{"class":696},[97,4476,720],{"class":700},[97,4478,4479,4482,4484,4486,4488],{"class":99,"line":1155},[97,4480,4481],{"class":4320},"stat",[97,4483,1302],{"class":700},[97,4485,1305],{"class":711},[97,4487,1308],{"class":696},[97,4489,720],{"class":700},[97,4491,4492,4495,4497,4499,4501],{"class":99,"line":1160},[97,4493,4494],{"class":704},"file",[97,4496,1302],{"class":700},[97,4498,1305],{"class":711},[97,4500,1308],{"class":696},[97,4502,720],{"class":700},[1390,4504,4505],{"id":4505},"查找",[89,4507,4509],{"className":1062,"code":4508,"language":1064,"meta":48,"style":48},"find . -name \"*.log\"                          # 按名\nfind . -type f -size +100M                    # >100M\nfind . -mtime -7                              # 7 天内\nfind . -name \"*.tmp\" -delete                  # 找到删除\nfind . -type f -exec chmod 644 {} \\;          # 批量执行\n\nwhich \u003Ccmd>                       # 命令路径\nwhereis \u003Ccmd>\nlocate \u003Cfile>                     # 快速（需 updatedb）\n",[74,4510,4511,4527,4548,4563,4580,4608,4612,4629,4642],{"__ignoreMap":48},[97,4512,4513,4516,4518,4521,4524],{"class":99,"line":100},[97,4514,4515],{"class":704},"find",[97,4517,1323],{"class":711},[97,4519,4520],{"class":1083}," -name",[97,4522,4523],{"class":711}," \"*.log\"",[97,4525,4526],{"class":1071},"                          # 按名\n",[97,4528,4529,4531,4533,4536,4539,4542,4545],{"class":99,"line":49},[97,4530,4515],{"class":704},[97,4532,1323],{"class":711},[97,4534,4535],{"class":1083}," -type",[97,4537,4538],{"class":711}," f",[97,4540,4541],{"class":1083}," -size",[97,4543,4544],{"class":711}," +100M",[97,4546,4547],{"class":1071},"                    # >100M\n",[97,4549,4550,4552,4554,4557,4560],{"class":99,"line":111},[97,4551,4515],{"class":704},[97,4553,1323],{"class":711},[97,4555,4556],{"class":1083}," -mtime",[97,4558,4559],{"class":1083}," -7",[97,4561,4562],{"class":1071},"                              # 7 天内\n",[97,4564,4565,4567,4569,4571,4574,4577],{"class":99,"line":196},[97,4566,4515],{"class":704},[97,4568,1323],{"class":711},[97,4570,4520],{"class":1083},[97,4572,4573],{"class":711}," \"*.tmp\"",[97,4575,4576],{"class":1083}," -delete",[97,4578,4579],{"class":1071},"                  # 找到删除\n",[97,4581,4582,4584,4586,4588,4590,4593,4596,4599,4602,4605],{"class":99,"line":202},[97,4583,4515],{"class":704},[97,4585,1323],{"class":711},[97,4587,4535],{"class":1083},[97,4589,4538],{"class":711},[97,4591,4592],{"class":1083}," -exec",[97,4594,4595],{"class":711}," chmod",[97,4597,4598],{"class":1083}," 644",[97,4600,4601],{"class":711}," {}",[97,4603,4604],{"class":1083}," \\;",[97,4606,4607],{"class":1071},"          # 批量执行\n",[97,4609,4610],{"class":99,"line":343},[97,4611,108],{"emptyLinePlaceholder":57},[97,4613,4614,4617,4619,4622,4624,4626],{"class":99,"line":349},[97,4615,4616],{"class":4320},"which",[97,4618,1302],{"class":700},[97,4620,4621],{"class":711},"cm",[97,4623,1634],{"class":696},[97,4625,1311],{"class":700},[97,4627,4628],{"class":1071},"                       # 命令路径\n",[97,4630,4631,4634,4636,4638,4640],{"class":99,"line":1134},[97,4632,4633],{"class":704},"whereis",[97,4635,1302],{"class":700},[97,4637,4621],{"class":711},[97,4639,1634],{"class":696},[97,4641,720],{"class":700},[97,4643,4644,4647,4649,4651,4653,4655],{"class":99,"line":1140},[97,4645,4646],{"class":704},"locate",[97,4648,1302],{"class":700},[97,4650,1305],{"class":711},[97,4652,1308],{"class":696},[97,4654,1311],{"class":700},[97,4656,4657],{"class":1071},"                     # 快速（需 updatedb）\n",[28,4659,4661],{"id":4660},"三文本处理","三、文本处理",[89,4663,4665],{"className":1062,"code":4664,"language":1064,"meta":48,"style":48},"cat \u002F less \u002F head -n 20 \u002F tail -n 20\ntail -f \u003Cfile>                    # 实时跟踪日志\ntail -F \u003Cfile>                    # rotate 后仍能跟踪\n\ngrep \"p\" \u003Cfile>                   # 基本\ngrep -r -n -i \"p\" .               # 递归+行号+忽略大小写\ngrep -v \"p\" \u003Cfile>                # 反选\ngrep -E \"a|b\" \u003Cfile>              # 扩展正则\nrg \"p\"                            # ripgrep（快，推荐）\n\nsed 's\u002Fold\u002Fnew\u002Fg' \u003Cfile>          # 替换到 stdout\nsed -i 's\u002Fold\u002Fnew\u002Fg' \u003Cfile>       # 原地替换\nsed -i.bak 's\u002Fold\u002Fnew\u002Fg' \u003Cfile>   # 带备份\nsed -n '10,20p' \u003Cfile>            # 打印范围\n\nawk '{print $1}' \u003Cfile>           # 第一列\nawk -F: '{print $1}' \u002Fetc\u002Fpasswd\nawk '$3 > 100 {print $1}' \u003Cfile>\n\ncut -d: -f1 \u002Fetc\u002Fpasswd\nsort \u003Cfile>\nsort -u \u003Cfile>                    # 去重\nuniq -c                           # 统计相邻（先 sort）\nwc -l \u003Cfile>\ntr 'a-z' 'A-Z'\n",[74,4666,4667,4699,4718,4736,4740,4759,4776,4795,4816,4826,4830,4849,4868,4888,4908,4912,4931,4943,4958,4962,4975,4988,5005,5015,5032],{"__ignoreMap":48},[97,4668,4669,4672,4675,4678,4680,4683,4686,4689,4691,4694,4696],{"class":99,"line":100},[97,4670,4671],{"class":704},"cat",[97,4673,4674],{"class":711}," \u002F",[97,4676,4677],{"class":711}," less",[97,4679,4674],{"class":711},[97,4681,4682],{"class":711}," head",[97,4684,4685],{"class":1083}," -n",[97,4687,4688],{"class":1083}," 20",[97,4690,4674],{"class":711},[97,4692,4693],{"class":711}," tail",[97,4695,4685],{"class":1083},[97,4697,4698],{"class":1083}," 20\n",[97,4700,4701,4704,4707,4709,4711,4713,4715],{"class":99,"line":49},[97,4702,4703],{"class":704},"tail",[97,4705,4706],{"class":1083}," -f",[97,4708,1302],{"class":700},[97,4710,1305],{"class":711},[97,4712,1308],{"class":696},[97,4714,1311],{"class":700},[97,4716,4717],{"class":1071},"                    # 实时跟踪日志\n",[97,4719,4720,4722,4725,4727,4729,4731,4733],{"class":99,"line":111},[97,4721,4703],{"class":704},[97,4723,4724],{"class":1083}," -F",[97,4726,1302],{"class":700},[97,4728,1305],{"class":711},[97,4730,1308],{"class":696},[97,4732,1311],{"class":700},[97,4734,4735],{"class":1071},"                    # rotate 后仍能跟踪\n",[97,4737,4738],{"class":99,"line":196},[97,4739,108],{"emptyLinePlaceholder":57},[97,4741,4742,4745,4748,4750,4752,4754,4756],{"class":99,"line":202},[97,4743,4744],{"class":704},"grep",[97,4746,4747],{"class":711}," \"p\"",[97,4749,1302],{"class":700},[97,4751,1305],{"class":711},[97,4753,1308],{"class":696},[97,4755,1311],{"class":700},[97,4757,4758],{"class":1071},"                   # 基本\n",[97,4760,4761,4763,4765,4767,4769,4771,4773],{"class":99,"line":343},[97,4762,4744],{"class":704},[97,4764,2887],{"class":1083},[97,4766,4685],{"class":1083},[97,4768,1724],{"class":1083},[97,4770,4747],{"class":711},[97,4772,1323],{"class":711},[97,4774,4775],{"class":1071},"               # 递归+行号+忽略大小写\n",[97,4777,4778,4780,4782,4784,4786,4788,4790,4792],{"class":99,"line":349},[97,4779,4744],{"class":704},[97,4781,2187],{"class":1083},[97,4783,4747],{"class":711},[97,4785,1302],{"class":700},[97,4787,1305],{"class":711},[97,4789,1308],{"class":696},[97,4791,1311],{"class":700},[97,4793,4794],{"class":1071},"                # 反选\n",[97,4796,4797,4799,4802,4805,4807,4809,4811,4813],{"class":99,"line":1134},[97,4798,4744],{"class":704},[97,4800,4801],{"class":1083}," -E",[97,4803,4804],{"class":711}," \"a|b\"",[97,4806,1302],{"class":700},[97,4808,1305],{"class":711},[97,4810,1308],{"class":696},[97,4812,1311],{"class":700},[97,4814,4815],{"class":1071},"              # 扩展正则\n",[97,4817,4818,4821,4823],{"class":99,"line":1140},[97,4819,4820],{"class":704},"rg",[97,4822,4747],{"class":711},[97,4824,4825],{"class":1071},"                            # ripgrep（快，推荐）\n",[97,4827,4828],{"class":99,"line":1155},[97,4829,108],{"emptyLinePlaceholder":57},[97,4831,4832,4835,4838,4840,4842,4844,4846],{"class":99,"line":1160},[97,4833,4834],{"class":704},"sed",[97,4836,4837],{"class":711}," 's\u002Fold\u002Fnew\u002Fg'",[97,4839,1302],{"class":700},[97,4841,1305],{"class":711},[97,4843,1308],{"class":696},[97,4845,1311],{"class":700},[97,4847,4848],{"class":1071},"          # 替换到 stdout\n",[97,4850,4851,4853,4855,4857,4859,4861,4863,4865],{"class":99,"line":1166},[97,4852,4834],{"class":704},[97,4854,1724],{"class":1083},[97,4856,4837],{"class":711},[97,4858,1302],{"class":700},[97,4860,1305],{"class":711},[97,4862,1308],{"class":696},[97,4864,1311],{"class":700},[97,4866,4867],{"class":1071},"       # 原地替换\n",[97,4869,4870,4872,4875,4877,4879,4881,4883,4885],{"class":99,"line":1181},[97,4871,4834],{"class":704},[97,4873,4874],{"class":1083}," -i.bak",[97,4876,4837],{"class":711},[97,4878,1302],{"class":700},[97,4880,1305],{"class":711},[97,4882,1308],{"class":696},[97,4884,1311],{"class":700},[97,4886,4887],{"class":1071},"   # 带备份\n",[97,4889,4890,4892,4894,4897,4899,4901,4903,4905],{"class":99,"line":1186},[97,4891,4834],{"class":704},[97,4893,4685],{"class":1083},[97,4895,4896],{"class":711}," '10,20p'",[97,4898,1302],{"class":700},[97,4900,1305],{"class":711},[97,4902,1308],{"class":696},[97,4904,1311],{"class":700},[97,4906,4907],{"class":1071},"            # 打印范围\n",[97,4909,4910],{"class":99,"line":1192},[97,4911,108],{"emptyLinePlaceholder":57},[97,4913,4914,4917,4920,4922,4924,4926,4928],{"class":99,"line":1207},[97,4915,4916],{"class":704},"awk",[97,4918,4919],{"class":711}," '{print $1}'",[97,4921,1302],{"class":700},[97,4923,1305],{"class":711},[97,4925,1308],{"class":696},[97,4927,1311],{"class":700},[97,4929,4930],{"class":1071},"           # 第一列\n",[97,4932,4933,4935,4938,4940],{"class":99,"line":1222},[97,4934,4916],{"class":704},[97,4936,4937],{"class":1083}," -F:",[97,4939,4919],{"class":711},[97,4941,4942],{"class":711}," \u002Fetc\u002Fpasswd\n",[97,4944,4945,4947,4950,4952,4954,4956],{"class":99,"line":1237},[97,4946,4916],{"class":704},[97,4948,4949],{"class":711}," '$3 > 100 {print $1}'",[97,4951,1302],{"class":700},[97,4953,1305],{"class":711},[97,4955,1308],{"class":696},[97,4957,720],{"class":700},[97,4959,4960],{"class":99,"line":1252},[97,4961,108],{"emptyLinePlaceholder":57},[97,4963,4964,4967,4970,4973],{"class":99,"line":1257},[97,4965,4966],{"class":704},"cut",[97,4968,4969],{"class":1083}," -d:",[97,4971,4972],{"class":1083}," -f1",[97,4974,4942],{"class":711},[97,4976,4977,4980,4982,4984,4986],{"class":99,"line":1263},[97,4978,4979],{"class":704},"sort",[97,4981,1302],{"class":700},[97,4983,1305],{"class":711},[97,4985,1308],{"class":696},[97,4987,720],{"class":700},[97,4989,4990,4992,4994,4996,4998,5000,5002],{"class":99,"line":3208},[97,4991,4979],{"class":704},[97,4993,2087],{"class":1083},[97,4995,1302],{"class":700},[97,4997,1305],{"class":711},[97,4999,1308],{"class":696},[97,5001,1311],{"class":700},[97,5003,5004],{"class":1071},"                    # 去重\n",[97,5006,5007,5010,5012],{"class":99,"line":3214},[97,5008,5009],{"class":704},"uniq",[97,5011,1546],{"class":1083},[97,5013,5014],{"class":1071},"                           # 统计相邻（先 sort）\n",[97,5016,5018,5021,5024,5026,5028,5030],{"class":99,"line":5017},24,[97,5019,5020],{"class":704},"wc",[97,5022,5023],{"class":1083}," -l",[97,5025,1302],{"class":700},[97,5027,1305],{"class":711},[97,5029,1308],{"class":696},[97,5031,720],{"class":700},[97,5033,5035,5037,5040],{"class":99,"line":5034},25,[97,5036,362],{"class":704},[97,5038,5039],{"class":711}," 'a-z'",[97,5041,5042],{"class":711}," 'A-Z'\n",[1390,5044,5045],{"id":5045},"管道组合",[89,5047,5049],{"className":1062,"code":5048,"language":1064,"meta":48,"style":48},"awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10\ndu -sh *\u002F | sort -rh | head -10\n",[74,5050,5051,5086],{"__ignoreMap":48},[97,5052,5053,5055,5057,5060,5062,5065,5067,5070,5072,5074,5076,5079,5081,5083],{"class":99,"line":100},[97,5054,4916],{"class":704},[97,5056,4919],{"class":711},[97,5058,5059],{"class":711}," access.log",[97,5061,4122],{"class":700},[97,5063,5064],{"class":704}," sort",[97,5066,4122],{"class":700},[97,5068,5069],{"class":704}," uniq",[97,5071,1546],{"class":1083},[97,5073,4122],{"class":700},[97,5075,5064],{"class":704},[97,5077,5078],{"class":1083}," -rn",[97,5080,4122],{"class":700},[97,5082,4682],{"class":704},[97,5084,5085],{"class":1083}," -10\n",[97,5087,5088,5091,5094,5097,5100,5102,5104,5107,5109,5111],{"class":99,"line":49},[97,5089,5090],{"class":704},"du",[97,5092,5093],{"class":1083}," -sh",[97,5095,5096],{"class":3594}," *",[97,5098,5099],{"class":711},"\u002F",[97,5101,4122],{"class":700},[97,5103,5064],{"class":704},[97,5105,5106],{"class":1083}," -rh",[97,5108,4122],{"class":700},[97,5110,4682],{"class":704},[97,5112,5085],{"class":1083},[28,5114,5116],{"id":5115},"四权限","四、权限",[89,5118,5120],{"className":1062,"code":5119,"language":1064,"meta":48,"style":48},"chmod 755 \u003Cfile>\nchmod +x \u003Cfile>\nchmod -R 644 \u003Cdir>\nchown user:group \u003Cfile>\nchown -R user \u003Cdir>\nchgrp group \u003Cfile>\numask\n",[74,5121,5122,5138,5153,5170,5186,5203,5219],{"__ignoreMap":48},[97,5123,5124,5127,5130,5132,5134,5136],{"class":99,"line":100},[97,5125,5126],{"class":704},"chmod",[97,5128,5129],{"class":1083}," 755",[97,5131,1302],{"class":700},[97,5133,1305],{"class":711},[97,5135,1308],{"class":696},[97,5137,720],{"class":700},[97,5139,5140,5142,5145,5147,5149,5151],{"class":99,"line":49},[97,5141,5126],{"class":704},[97,5143,5144],{"class":711}," +x",[97,5146,1302],{"class":700},[97,5148,1305],{"class":711},[97,5150,1308],{"class":696},[97,5152,720],{"class":700},[97,5154,5155,5157,5160,5162,5164,5166,5168],{"class":99,"line":111},[97,5156,5126],{"class":704},[97,5158,5159],{"class":1083}," -R",[97,5161,4598],{"class":1083},[97,5163,1302],{"class":700},[97,5165,4372],{"class":711},[97,5167,4375],{"class":696},[97,5169,720],{"class":700},[97,5171,5172,5175,5178,5180,5182,5184],{"class":99,"line":196},[97,5173,5174],{"class":704},"chown",[97,5176,5177],{"class":711}," user:group",[97,5179,1302],{"class":700},[97,5181,1305],{"class":711},[97,5183,1308],{"class":696},[97,5185,720],{"class":700},[97,5187,5188,5190,5192,5195,5197,5199,5201],{"class":99,"line":202},[97,5189,5174],{"class":704},[97,5191,5159],{"class":1083},[97,5193,5194],{"class":711}," user",[97,5196,1302],{"class":700},[97,5198,4372],{"class":711},[97,5200,4375],{"class":696},[97,5202,720],{"class":700},[97,5204,5205,5208,5211,5213,5215,5217],{"class":99,"line":343},[97,5206,5207],{"class":704},"chgrp",[97,5209,5210],{"class":711}," group",[97,5212,1302],{"class":700},[97,5214,1305],{"class":711},[97,5216,1308],{"class":696},[97,5218,720],{"class":700},[97,5220,5221],{"class":99,"line":349},[97,5222,5223],{"class":4320},"umask\n",[14,5225,5226],{},"数字权限：",[356,5228,5229,5239],{},[359,5230,5231],{},[362,5232,5233,5236],{},[365,5234,5235],{},"数字",[365,5237,5238],{},"权限",[375,5240,5241,5249,5257,5265],{},[362,5242,5243,5246],{},[380,5244,5245],{},"4",[380,5247,5248],{},"r--",[362,5250,5251,5254],{},[380,5252,5253],{},"5",[380,5255,5256],{},"r-x",[362,5258,5259,5262],{},[380,5260,5261],{},"6",[380,5263,5264],{},"rw-",[362,5266,5267,5270],{},[380,5268,5269],{},"7",[380,5271,5272],{},"rwx",[14,5274,5275,5276,5279,5280,5283,5284,5279,5287,21],{},"例：",[74,5277,5278],{},"755"," = ",[74,5281,5282],{},"rwxr-xr-x","，",[74,5285,5286],{},"644",[74,5288,5289],{},"rw-r--r--",[14,5291,5292],{},"特殊权限：",[89,5294,5296],{"className":1062,"code":5295,"language":1064,"meta":48,"style":48},"chmod u+s \u003Cfile>                  # SUID\nchmod g+s \u003Cdir>                   # SGID\nchmod +t \u003Cdir>                    # Sticky（如 \u002Ftmp）\n",[74,5297,5298,5316,5334],{"__ignoreMap":48},[97,5299,5300,5302,5305,5307,5309,5311,5313],{"class":99,"line":100},[97,5301,5126],{"class":704},[97,5303,5304],{"class":711}," u+s",[97,5306,1302],{"class":700},[97,5308,1305],{"class":711},[97,5310,1308],{"class":696},[97,5312,1311],{"class":700},[97,5314,5315],{"class":1071},"                  # SUID\n",[97,5317,5318,5320,5323,5325,5327,5329,5331],{"class":99,"line":49},[97,5319,5126],{"class":704},[97,5321,5322],{"class":711}," g+s",[97,5324,1302],{"class":700},[97,5326,4372],{"class":711},[97,5328,4375],{"class":696},[97,5330,1311],{"class":700},[97,5332,5333],{"class":1071},"                   # SGID\n",[97,5335,5336,5338,5341,5343,5345,5347,5349],{"class":99,"line":111},[97,5337,5126],{"class":704},[97,5339,5340],{"class":711}," +t",[97,5342,1302],{"class":700},[97,5344,4372],{"class":711},[97,5346,4375],{"class":696},[97,5348,1311],{"class":700},[97,5350,5351],{"class":1071},"                    # Sticky（如 \u002Ftmp）\n",[28,5353,5355],{"id":5354},"五进程管理","五、进程管理",[89,5357,5359],{"className":1062,"code":5358,"language":1064,"meta":48,"style":48},"ps aux\nps aux | grep nginx\npgrep -f \"pattern\"\npidof \u003Cname>\n\ntop                               # P 按 CPU，M 按内存\nhtop                              # 更友好\n\nkill \u003Cpid>                        # SIGTERM\nkill -9 \u003Cpid>                     # 强制\npkill -f \"pattern\"\nkillall \u003Cname>\n\nnice -n 10 \u003Ccmd>\nrenice -n 5 -p \u003Cpid>\n\nCtrl+Z                            # 挂起\nbg \u002F fg \u002F jobs\n",[74,5360,5361,5369,5383,5393,5406,5410,5418,5426,5430,5447,5465,5474,5487,5491,5509,5528,5532,5540],{"__ignoreMap":48},[97,5362,5363,5366],{"class":99,"line":100},[97,5364,5365],{"class":704},"ps",[97,5367,5368],{"class":711}," aux\n",[97,5370,5371,5373,5376,5378,5380],{"class":99,"line":49},[97,5372,5365],{"class":704},[97,5374,5375],{"class":711}," aux",[97,5377,4122],{"class":700},[97,5379,4125],{"class":704},[97,5381,5382],{"class":711}," nginx\n",[97,5384,5385,5388,5390],{"class":99,"line":111},[97,5386,5387],{"class":704},"pgrep",[97,5389,4706],{"class":1083},[97,5391,5392],{"class":711}," \"pattern\"\n",[97,5394,5395,5398,5400,5402,5404],{"class":99,"line":196},[97,5396,5397],{"class":704},"pidof",[97,5399,1302],{"class":700},[97,5401,1512],{"class":711},[97,5403,1308],{"class":696},[97,5405,720],{"class":700},[97,5407,5408],{"class":99,"line":202},[97,5409,108],{"emptyLinePlaceholder":57},[97,5411,5412,5415],{"class":99,"line":343},[97,5413,5414],{"class":704},"top",[97,5416,5417],{"class":1071},"                               # P 按 CPU，M 按内存\n",[97,5419,5420,5423],{"class":99,"line":349},[97,5421,5422],{"class":704},"htop",[97,5424,5425],{"class":1071},"                              # 更友好\n",[97,5427,5428],{"class":99,"line":1134},[97,5429,108],{"emptyLinePlaceholder":57},[97,5431,5432,5435,5437,5440,5442,5444],{"class":99,"line":1140},[97,5433,5434],{"class":4320},"kill",[97,5436,1302],{"class":700},[97,5438,5439],{"class":711},"pi",[97,5441,1634],{"class":696},[97,5443,1311],{"class":700},[97,5445,5446],{"class":1071},"                        # SIGTERM\n",[97,5448,5449,5451,5454,5456,5458,5460,5462],{"class":99,"line":1155},[97,5450,5434],{"class":4320},[97,5452,5453],{"class":1083}," -9",[97,5455,1302],{"class":700},[97,5457,5439],{"class":711},[97,5459,1634],{"class":696},[97,5461,1311],{"class":700},[97,5463,5464],{"class":1071},"                     # 强制\n",[97,5466,5467,5470,5472],{"class":99,"line":1160},[97,5468,5469],{"class":704},"pkill",[97,5471,4706],{"class":1083},[97,5473,5392],{"class":711},[97,5475,5476,5479,5481,5483,5485],{"class":99,"line":1166},[97,5477,5478],{"class":704},"killall",[97,5480,1302],{"class":700},[97,5482,1512],{"class":711},[97,5484,1308],{"class":696},[97,5486,720],{"class":700},[97,5488,5489],{"class":99,"line":1181},[97,5490,108],{"emptyLinePlaceholder":57},[97,5492,5493,5496,5498,5501,5503,5505,5507],{"class":99,"line":1186},[97,5494,5495],{"class":704},"nice",[97,5497,4685],{"class":1083},[97,5499,5500],{"class":1083}," 10",[97,5502,1302],{"class":700},[97,5504,4621],{"class":711},[97,5506,1634],{"class":696},[97,5508,720],{"class":700},[97,5510,5511,5514,5516,5518,5520,5522,5524,5526],{"class":99,"line":1192},[97,5512,5513],{"class":704},"renice",[97,5515,4685],{"class":1083},[97,5517,3836],{"class":1083},[97,5519,2505],{"class":1083},[97,5521,1302],{"class":700},[97,5523,5439],{"class":711},[97,5525,1634],{"class":696},[97,5527,720],{"class":700},[97,5529,5530],{"class":99,"line":1207},[97,5531,108],{"emptyLinePlaceholder":57},[97,5533,5534,5537],{"class":99,"line":1222},[97,5535,5536],{"class":704},"Ctrl+Z",[97,5538,5539],{"class":1071},"                            # 挂起\n",[97,5541,5542,5545,5547,5550,5552],{"class":99,"line":1237},[97,5543,5544],{"class":4320},"bg",[97,5546,4674],{"class":711},[97,5548,5549],{"class":711}," fg",[97,5551,4674],{"class":711},[97,5553,5554],{"class":711}," jobs\n",[14,5556,5557],{},"信号：",[356,5559,5560,5572],{},[359,5561,5562],{},[362,5563,5564,5567,5570],{},[365,5565,5566],{},"信号",[365,5568,5569],{},"编号",[365,5571,373],{},[375,5573,5574,5584,5594,5605],{},[362,5575,5576,5579,5581],{},[380,5577,5578],{},"SIGHUP",[380,5580,62],{},[380,5582,5583],{},"挂起 \u002F 重载",[362,5585,5586,5589,5591],{},[380,5587,5588],{},"SIGINT",[380,5590,63],{},[380,5592,5593],{},"Ctrl+C",[362,5595,5596,5599,5602],{},[380,5597,5598],{},"SIGKILL",[380,5600,5601],{},"9",[380,5603,5604],{},"强杀，不可捕获",[362,5606,5607,5610,5613],{},[380,5608,5609],{},"SIGTERM",[380,5611,5612],{},"15",[380,5614,5615],{},"优雅退出（默认）",[28,5617,5619],{"id":5618},"六网络","六、网络",[89,5621,5623],{"className":1062,"code":5622,"language":1064,"meta":48,"style":48},"ip addr                           # 查看 IP\nip route\nss -tunlp                         # 监听端口（推荐）\nnetstat -tunlp                    # 老命令\nlsof -i :8080                     # 谁占端口\n\nping \u003Chost>\nping -c 4 \u003Chost>\ntraceroute \u003Chost>\nmtr \u003Chost>                        # 持续 traceroute\n\ncurl -I \u003Curl>                     # 只看头\ncurl -v \u003Curl>                     # 详细\ncurl -o file.zip \u003Curl>            # 下载\ncurl -X POST -d '{}' -H \"Content-Type: application\u002Fjson\" \u003Curl>\n\nwget \u003Curl>\nwget -c \u003Curl>                     # 断点续传\nwget -r -np \u003Curl>                 # 递归\n\ndig \u003Cdomain>\ndig +short \u003Cdomain>\nnslookup \u003Cdomain>\nhost \u003Cdomain>\n",[74,5624,5625,5636,5643,5654,5664,5677,5681,5695,5712,5725,5741,5745,5764,5781,5802,5831,5835,5848,5865,5885,5889,5904,5919,5932],{"__ignoreMap":48},[97,5626,5627,5630,5633],{"class":99,"line":100},[97,5628,5629],{"class":704},"ip",[97,5631,5632],{"class":711}," addr",[97,5634,5635],{"class":1071},"                           # 查看 IP\n",[97,5637,5638,5640],{"class":99,"line":49},[97,5639,5629],{"class":704},[97,5641,5642],{"class":711}," route\n",[97,5644,5645,5648,5651],{"class":99,"line":111},[97,5646,5647],{"class":704},"ss",[97,5649,5650],{"class":1083}," -tunlp",[97,5652,5653],{"class":1071},"                         # 监听端口（推荐）\n",[97,5655,5656,5659,5661],{"class":99,"line":196},[97,5657,5658],{"class":704},"netstat",[97,5660,5650],{"class":1083},[97,5662,5663],{"class":1071},"                    # 老命令\n",[97,5665,5666,5669,5671,5674],{"class":99,"line":202},[97,5667,5668],{"class":704},"lsof",[97,5670,1724],{"class":1083},[97,5672,5673],{"class":711}," :8080",[97,5675,5676],{"class":1071},"                     # 谁占端口\n",[97,5678,5679],{"class":99,"line":343},[97,5680,108],{"emptyLinePlaceholder":57},[97,5682,5683,5686,5688,5691,5693],{"class":99,"line":349},[97,5684,5685],{"class":704},"ping",[97,5687,1302],{"class":700},[97,5689,5690],{"class":711},"hos",[97,5692,2594],{"class":696},[97,5694,720],{"class":700},[97,5696,5697,5699,5701,5704,5706,5708,5710],{"class":99,"line":1134},[97,5698,5685],{"class":704},[97,5700,1546],{"class":1083},[97,5702,5703],{"class":1083}," 4",[97,5705,1302],{"class":700},[97,5707,5690],{"class":711},[97,5709,2594],{"class":696},[97,5711,720],{"class":700},[97,5713,5714,5717,5719,5721,5723],{"class":99,"line":1140},[97,5715,5716],{"class":704},"traceroute",[97,5718,1302],{"class":700},[97,5720,5690],{"class":711},[97,5722,2594],{"class":696},[97,5724,720],{"class":700},[97,5726,5727,5730,5732,5734,5736,5738],{"class":99,"line":1155},[97,5728,5729],{"class":704},"mtr",[97,5731,1302],{"class":700},[97,5733,5690],{"class":711},[97,5735,2594],{"class":696},[97,5737,1311],{"class":700},[97,5739,5740],{"class":1071},"                        # 持续 traceroute\n",[97,5742,5743],{"class":99,"line":1160},[97,5744,108],{"emptyLinePlaceholder":57},[97,5746,5747,5750,5753,5755,5757,5759,5761],{"class":99,"line":1166},[97,5748,5749],{"class":704},"curl",[97,5751,5752],{"class":1083}," -I",[97,5754,1302],{"class":700},[97,5756,2206],{"class":711},[97,5758,2209],{"class":696},[97,5760,1311],{"class":700},[97,5762,5763],{"class":1071},"                     # 只看头\n",[97,5765,5766,5768,5770,5772,5774,5776,5778],{"class":99,"line":1181},[97,5767,5749],{"class":704},[97,5769,2187],{"class":1083},[97,5771,1302],{"class":700},[97,5773,2206],{"class":711},[97,5775,2209],{"class":696},[97,5777,1311],{"class":700},[97,5779,5780],{"class":1071},"                     # 详细\n",[97,5782,5783,5785,5788,5791,5793,5795,5797,5799],{"class":99,"line":1186},[97,5784,5749],{"class":704},[97,5786,5787],{"class":1083}," -o",[97,5789,5790],{"class":711}," file.zip",[97,5792,1302],{"class":700},[97,5794,2206],{"class":711},[97,5796,2209],{"class":696},[97,5798,1311],{"class":700},[97,5800,5801],{"class":1071},"            # 下载\n",[97,5803,5804,5806,5809,5812,5814,5817,5820,5823,5825,5827,5829],{"class":99,"line":1192},[97,5805,5749],{"class":704},[97,5807,5808],{"class":1083}," -X",[97,5810,5811],{"class":711}," POST",[97,5813,1587],{"class":1083},[97,5815,5816],{"class":711}," '{}'",[97,5818,5819],{"class":1083}," -H",[97,5821,5822],{"class":711}," \"Content-Type: application\u002Fjson\"",[97,5824,1302],{"class":700},[97,5826,2206],{"class":711},[97,5828,2209],{"class":696},[97,5830,720],{"class":700},[97,5832,5833],{"class":99,"line":1207},[97,5834,108],{"emptyLinePlaceholder":57},[97,5836,5837,5840,5842,5844,5846],{"class":99,"line":1222},[97,5838,5839],{"class":704},"wget",[97,5841,1302],{"class":700},[97,5843,2206],{"class":711},[97,5845,2209],{"class":696},[97,5847,720],{"class":700},[97,5849,5850,5852,5854,5856,5858,5860,5862],{"class":99,"line":1237},[97,5851,5839],{"class":704},[97,5853,1546],{"class":1083},[97,5855,1302],{"class":700},[97,5857,2206],{"class":711},[97,5859,2209],{"class":696},[97,5861,1311],{"class":700},[97,5863,5864],{"class":1071},"                     # 断点续传\n",[97,5866,5867,5869,5871,5874,5876,5878,5880,5882],{"class":99,"line":1252},[97,5868,5839],{"class":704},[97,5870,2887],{"class":1083},[97,5872,5873],{"class":1083}," -np",[97,5875,1302],{"class":700},[97,5877,2206],{"class":711},[97,5879,2209],{"class":696},[97,5881,1311],{"class":700},[97,5883,5884],{"class":1071},"                 # 递归\n",[97,5886,5887],{"class":99,"line":1257},[97,5888,108],{"emptyLinePlaceholder":57},[97,5890,5891,5894,5896,5899,5902],{"class":99,"line":1263},[97,5892,5893],{"class":704},"dig",[97,5895,1302],{"class":700},[97,5897,5898],{"class":711},"domai",[97,5900,5901],{"class":696},"n",[97,5903,720],{"class":700},[97,5905,5906,5908,5911,5913,5915,5917],{"class":99,"line":3208},[97,5907,5893],{"class":704},[97,5909,5910],{"class":711}," +short",[97,5912,1302],{"class":700},[97,5914,5898],{"class":711},[97,5916,5901],{"class":696},[97,5918,720],{"class":700},[97,5920,5921,5924,5926,5928,5930],{"class":99,"line":3214},[97,5922,5923],{"class":704},"nslookup",[97,5925,1302],{"class":700},[97,5927,5898],{"class":711},[97,5929,5901],{"class":696},[97,5931,720],{"class":700},[97,5933,5934,5937,5939,5941,5943],{"class":99,"line":5017},[97,5935,5936],{"class":704},"host",[97,5938,1302],{"class":700},[97,5940,5898],{"class":711},[97,5942,5901],{"class":696},[97,5944,720],{"class":700},[1390,5946,5947],{"id":5947},"防火墙",[89,5949,5951],{"className":1062,"code":5950,"language":1064,"meta":48,"style":48},"# ufw（Ubuntu）\nufw status\nufw allow 22\nufw allow 80\u002Ftcp\nufw delete allow 80\nufw enable\n\n# firewalld（CentOS）\nfirewall-cmd --list-all\nfirewall-cmd --add-port=8080\u002Ftcp --permanent\nfirewall-cmd --reload\n\n# iptables\niptables -L -n -v\niptables -A INPUT -p tcp --dport 8080 -j ACCEPT\n",[74,5952,5953,5958,5965,5975,5984,5996,6003,6007,6012,6020,6030,6037,6041,6046,6059],{"__ignoreMap":48},[97,5954,5955],{"class":99,"line":100},[97,5956,5957],{"class":1071},"# ufw（Ubuntu）\n",[97,5959,5960,5963],{"class":99,"line":49},[97,5961,5962],{"class":704},"ufw",[97,5964,1204],{"class":711},[97,5966,5967,5969,5972],{"class":99,"line":111},[97,5968,5962],{"class":704},[97,5970,5971],{"class":711}," allow",[97,5973,5974],{"class":1083}," 22\n",[97,5976,5977,5979,5981],{"class":99,"line":196},[97,5978,5962],{"class":704},[97,5980,5971],{"class":711},[97,5982,5983],{"class":711}," 80\u002Ftcp\n",[97,5985,5986,5988,5991,5993],{"class":99,"line":202},[97,5987,5962],{"class":704},[97,5989,5990],{"class":711}," delete",[97,5992,5971],{"class":711},[97,5994,5995],{"class":1083}," 80\n",[97,5997,5998,6000],{"class":99,"line":343},[97,5999,5962],{"class":704},[97,6001,6002],{"class":711}," enable\n",[97,6004,6005],{"class":99,"line":349},[97,6006,108],{"emptyLinePlaceholder":57},[97,6008,6009],{"class":99,"line":1134},[97,6010,6011],{"class":1071},"# firewalld（CentOS）\n",[97,6013,6014,6017],{"class":99,"line":1140},[97,6015,6016],{"class":704},"firewall-cmd",[97,6018,6019],{"class":1083}," --list-all\n",[97,6021,6022,6024,6027],{"class":99,"line":1155},[97,6023,6016],{"class":704},[97,6025,6026],{"class":1083}," --add-port=8080\u002Ftcp",[97,6028,6029],{"class":1083}," --permanent\n",[97,6031,6032,6034],{"class":99,"line":1160},[97,6033,6016],{"class":704},[97,6035,6036],{"class":1083}," --reload\n",[97,6038,6039],{"class":99,"line":1166},[97,6040,108],{"emptyLinePlaceholder":57},[97,6042,6043],{"class":99,"line":1181},[97,6044,6045],{"class":1071},"# iptables\n",[97,6047,6048,6051,6054,6056],{"class":99,"line":1186},[97,6049,6050],{"class":704},"iptables",[97,6052,6053],{"class":1083}," -L",[97,6055,4685],{"class":1083},[97,6057,6058],{"class":1083}," -v\n",[97,6060,6061,6063,6065,6068,6070,6073,6076,6079,6082],{"class":99,"line":1192},[97,6062,6050],{"class":704},[97,6064,1335],{"class":1083},[97,6066,6067],{"class":711}," INPUT",[97,6069,2505],{"class":1083},[97,6071,6072],{"class":711}," tcp",[97,6074,6075],{"class":1083}," --dport",[97,6077,6078],{"class":1083}," 8080",[97,6080,6081],{"class":1083}," -j",[97,6083,6084],{"class":711}," ACCEPT\n",[28,6086,6088],{"id":6087},"七磁盘与内存","七、磁盘与内存",[89,6090,6092],{"className":1062,"code":6091,"language":1064,"meta":48,"style":48},"df -h                             # 磁盘\ndf -i                             # inode\ndu -sh \u003Cdir>\ndu -sh * | sort -rh | head -10\n\nfree -h                           # 内存\nvmstat 1\niostat -x 1                       # 需 sysstat\n\nlsblk\nfdisk -l\nmount \u002Fdev\u002Fsdb1 \u002Fmnt\numount \u002Fmnt\n",[74,6093,6094,6105,6114,6128,6148,6152,6162,6170,6184,6188,6193,6201,6212],{"__ignoreMap":48},[97,6095,6096,6099,6102],{"class":99,"line":100},[97,6097,6098],{"class":704},"df",[97,6100,6101],{"class":1083}," -h",[97,6103,6104],{"class":1071},"                             # 磁盘\n",[97,6106,6107,6109,6111],{"class":99,"line":49},[97,6108,6098],{"class":704},[97,6110,1724],{"class":1083},[97,6112,6113],{"class":1071},"                             # inode\n",[97,6115,6116,6118,6120,6122,6124,6126],{"class":99,"line":111},[97,6117,5090],{"class":704},[97,6119,5093],{"class":1083},[97,6121,1302],{"class":700},[97,6123,4372],{"class":711},[97,6125,4375],{"class":696},[97,6127,720],{"class":700},[97,6129,6130,6132,6134,6136,6138,6140,6142,6144,6146],{"class":99,"line":196},[97,6131,5090],{"class":704},[97,6133,5093],{"class":1083},[97,6135,5096],{"class":3594},[97,6137,4122],{"class":700},[97,6139,5064],{"class":704},[97,6141,5106],{"class":1083},[97,6143,4122],{"class":700},[97,6145,4682],{"class":704},[97,6147,5085],{"class":1083},[97,6149,6150],{"class":99,"line":202},[97,6151,108],{"emptyLinePlaceholder":57},[97,6153,6154,6157,6159],{"class":99,"line":343},[97,6155,6156],{"class":704},"free",[97,6158,6101],{"class":1083},[97,6160,6161],{"class":1071},"                           # 内存\n",[97,6163,6164,6167],{"class":99,"line":349},[97,6165,6166],{"class":704},"vmstat",[97,6168,6169],{"class":1083}," 1\n",[97,6171,6172,6175,6178,6181],{"class":99,"line":1134},[97,6173,6174],{"class":704},"iostat",[97,6176,6177],{"class":1083}," -x",[97,6179,6180],{"class":1083}," 1",[97,6182,6183],{"class":1071},"                       # 需 sysstat\n",[97,6185,6186],{"class":99,"line":1140},[97,6187,108],{"emptyLinePlaceholder":57},[97,6189,6190],{"class":99,"line":1155},[97,6191,6192],{"class":704},"lsblk\n",[97,6194,6195,6198],{"class":99,"line":1160},[97,6196,6197],{"class":704},"fdisk",[97,6199,6200],{"class":1083}," -l\n",[97,6202,6203,6206,6209],{"class":99,"line":1166},[97,6204,6205],{"class":704},"mount",[97,6207,6208],{"class":711}," \u002Fdev\u002Fsdb1",[97,6210,6211],{"class":711}," \u002Fmnt\n",[97,6213,6214,6217],{"class":99,"line":1181},[97,6215,6216],{"class":704},"umount",[97,6218,6211],{"class":711},[14,6220,6221],{},"找大文件：",[89,6223,6225],{"className":1062,"code":6224,"language":1064,"meta":48,"style":48},"find \u002F -type f -size +1G 2>\u002Fdev\u002Fnull\ndu -ah \u002F | sort -rh | head -20\n",[74,6226,6227,6248],{"__ignoreMap":48},[97,6228,6229,6231,6233,6235,6237,6239,6242,6245],{"class":99,"line":100},[97,6230,4515],{"class":704},[97,6232,4674],{"class":711},[97,6234,4535],{"class":1083},[97,6236,4538],{"class":711},[97,6238,4541],{"class":1083},[97,6240,6241],{"class":711}," +1G",[97,6243,6244],{"class":700}," 2>",[97,6246,6247],{"class":711},"\u002Fdev\u002Fnull\n",[97,6249,6250,6252,6255,6257,6259,6261,6263,6265,6267],{"class":99,"line":49},[97,6251,5090],{"class":704},[97,6253,6254],{"class":1083}," -ah",[97,6256,4674],{"class":711},[97,6258,4122],{"class":700},[97,6260,5064],{"class":704},[97,6262,5106],{"class":1083},[97,6264,4122],{"class":700},[97,6266,4682],{"class":704},[97,6268,6269],{"class":1083}," -20\n",[28,6271,6273],{"id":6272},"八压缩与归档","八、压缩与归档",[89,6275,6277],{"className":1062,"code":6276,"language":1064,"meta":48,"style":48},"tar -czvf a.tar.gz \u003Cdir>          # 打包\ntar -xzvf a.tar.gz                # 解包\ntar -tzvf a.tar.gz                # 查看内容\ntar -xzvf a.tar.gz -C \u002Ftmp\n\nzip -r a.zip \u003Cdir>\nunzip a.zip\nunzip -l a.zip\nunzip a.zip -d \u002Ftmp\n\ngzip \u003Cfile>\ngunzip \u003Cfile>.gz\n\nzstd \u003Cfile>                       # 快速压缩\nxz -9 \u003Cfile>                      # 高压缩\n",[74,6278,6279,6301,6313,6325,6339,6343,6361,6369,6377,6387,6391,6404,6420,6424,6440],{"__ignoreMap":48},[97,6280,6281,6284,6287,6290,6292,6294,6296,6298],{"class":99,"line":100},[97,6282,6283],{"class":704},"tar",[97,6285,6286],{"class":1083}," -czvf",[97,6288,6289],{"class":711}," a.tar.gz",[97,6291,1302],{"class":700},[97,6293,4372],{"class":711},[97,6295,4375],{"class":696},[97,6297,1311],{"class":700},[97,6299,6300],{"class":1071},"          # 打包\n",[97,6302,6303,6305,6308,6310],{"class":99,"line":49},[97,6304,6283],{"class":704},[97,6306,6307],{"class":1083}," -xzvf",[97,6309,6289],{"class":711},[97,6311,6312],{"class":1071},"                # 解包\n",[97,6314,6315,6317,6320,6322],{"class":99,"line":111},[97,6316,6283],{"class":704},[97,6318,6319],{"class":1083}," -tzvf",[97,6321,6289],{"class":711},[97,6323,6324],{"class":1071},"                # 查看内容\n",[97,6326,6327,6329,6331,6333,6336],{"class":99,"line":196},[97,6328,6283],{"class":704},[97,6330,6307],{"class":1083},[97,6332,6289],{"class":711},[97,6334,6335],{"class":1083}," -C",[97,6337,6338],{"class":711}," \u002Ftmp\n",[97,6340,6341],{"class":99,"line":202},[97,6342,108],{"emptyLinePlaceholder":57},[97,6344,6345,6348,6350,6353,6355,6357,6359],{"class":99,"line":343},[97,6346,6347],{"class":704},"zip",[97,6349,2887],{"class":1083},[97,6351,6352],{"class":711}," a.zip",[97,6354,1302],{"class":700},[97,6356,4372],{"class":711},[97,6358,4375],{"class":696},[97,6360,720],{"class":700},[97,6362,6363,6366],{"class":99,"line":349},[97,6364,6365],{"class":704},"unzip",[97,6367,6368],{"class":711}," a.zip\n",[97,6370,6371,6373,6375],{"class":99,"line":1134},[97,6372,6365],{"class":704},[97,6374,5023],{"class":1083},[97,6376,6368],{"class":711},[97,6378,6379,6381,6383,6385],{"class":99,"line":1140},[97,6380,6365],{"class":704},[97,6382,6352],{"class":711},[97,6384,1587],{"class":1083},[97,6386,6338],{"class":711},[97,6388,6389],{"class":99,"line":1155},[97,6390,108],{"emptyLinePlaceholder":57},[97,6392,6393,6396,6398,6400,6402],{"class":99,"line":1160},[97,6394,6395],{"class":704},"gzip",[97,6397,1302],{"class":700},[97,6399,1305],{"class":711},[97,6401,1308],{"class":696},[97,6403,720],{"class":700},[97,6405,6406,6409,6411,6413,6415,6417],{"class":99,"line":1166},[97,6407,6408],{"class":704},"gunzip",[97,6410,1302],{"class":700},[97,6412,1305],{"class":711},[97,6414,1308],{"class":696},[97,6416,1311],{"class":700},[97,6418,6419],{"class":711},".gz\n",[97,6421,6422],{"class":99,"line":1181},[97,6423,108],{"emptyLinePlaceholder":57},[97,6425,6426,6429,6431,6433,6435,6437],{"class":99,"line":1186},[97,6427,6428],{"class":704},"zstd",[97,6430,1302],{"class":700},[97,6432,1305],{"class":711},[97,6434,1308],{"class":696},[97,6436,1311],{"class":700},[97,6438,6439],{"class":1071},"                       # 快速压缩\n",[97,6441,6442,6445,6447,6449,6451,6453,6455],{"class":99,"line":1192},[97,6443,6444],{"class":704},"xz",[97,6446,5453],{"class":1083},[97,6448,1302],{"class":700},[97,6450,1305],{"class":711},[97,6452,1308],{"class":696},[97,6454,1311],{"class":700},[97,6456,6457],{"class":1071},"                      # 高压缩\n",[28,6459,6461],{"id":6460},"九用户与权限","九、用户与权限",[89,6463,6465],{"className":1062,"code":6464,"language":1064,"meta":48,"style":48},"whoami\nid\nwho\nw\nlast\n\nuseradd -m -s \u002Fbin\u002Fbash \u003Cuser>\npasswd \u003Cuser>\nusermod -aG sudo \u003Cuser>\nuserdel -r \u003Cuser>\n\ngroupadd \u003Cgroup>\ngroups \u003Cuser>\n\nsu - \u003Cuser>\nsudo \u003Ccmd>\nsudo -i                           # 进 root shell\nsudo -u \u003Cuser> \u003Ccmd>\n",[74,6466,6467,6472,6477,6482,6487,6492,6496,6517,6530,6549,6564,6568,6582,6595,6599,6614,6626,6635],{"__ignoreMap":48},[97,6468,6469],{"class":99,"line":100},[97,6470,6471],{"class":704},"whoami\n",[97,6473,6474],{"class":99,"line":49},[97,6475,6476],{"class":704},"id\n",[97,6478,6479],{"class":99,"line":111},[97,6480,6481],{"class":704},"who\n",[97,6483,6484],{"class":99,"line":196},[97,6485,6486],{"class":704},"w\n",[97,6488,6489],{"class":99,"line":202},[97,6490,6491],{"class":704},"last\n",[97,6493,6494],{"class":99,"line":343},[97,6495,108],{"emptyLinePlaceholder":57},[97,6497,6498,6501,6503,6505,6508,6510,6513,6515],{"class":99,"line":349},[97,6499,6500],{"class":704},"useradd",[97,6502,1348],{"class":1083},[97,6504,4441],{"class":1083},[97,6506,6507],{"class":711}," \u002Fbin\u002Fbash",[97,6509,1302],{"class":700},[97,6511,6512],{"class":711},"use",[97,6514,4375],{"class":696},[97,6516,720],{"class":700},[97,6518,6519,6522,6524,6526,6528],{"class":99,"line":1134},[97,6520,6521],{"class":704},"passwd",[97,6523,1302],{"class":700},[97,6525,6512],{"class":711},[97,6527,4375],{"class":696},[97,6529,720],{"class":700},[97,6531,6532,6535,6538,6541,6543,6545,6547],{"class":99,"line":1140},[97,6533,6534],{"class":704},"usermod",[97,6536,6537],{"class":1083}," -aG",[97,6539,6540],{"class":711}," sudo",[97,6542,1302],{"class":700},[97,6544,6512],{"class":711},[97,6546,4375],{"class":696},[97,6548,720],{"class":700},[97,6550,6551,6554,6556,6558,6560,6562],{"class":99,"line":1155},[97,6552,6553],{"class":704},"userdel",[97,6555,2887],{"class":1083},[97,6557,1302],{"class":700},[97,6559,6512],{"class":711},[97,6561,4375],{"class":696},[97,6563,720],{"class":700},[97,6565,6566],{"class":99,"line":1160},[97,6567,108],{"emptyLinePlaceholder":57},[97,6569,6570,6573,6575,6578,6580],{"class":99,"line":1166},[97,6571,6572],{"class":704},"groupadd",[97,6574,1302],{"class":700},[97,6576,6577],{"class":711},"grou",[97,6579,14],{"class":696},[97,6581,720],{"class":700},[97,6583,6584,6587,6589,6591,6593],{"class":99,"line":1181},[97,6585,6586],{"class":704},"groups",[97,6588,1302],{"class":700},[97,6590,6512],{"class":711},[97,6592,4375],{"class":696},[97,6594,720],{"class":700},[97,6596,6597],{"class":99,"line":1186},[97,6598,108],{"emptyLinePlaceholder":57},[97,6600,6601,6604,6606,6608,6610,6612],{"class":99,"line":1192},[97,6602,6603],{"class":704},"su",[97,6605,4343],{"class":711},[97,6607,1302],{"class":700},[97,6609,6512],{"class":711},[97,6611,4375],{"class":696},[97,6613,720],{"class":700},[97,6615,6616,6618,6620,6622,6624],{"class":99,"line":1207},[97,6617,3382],{"class":704},[97,6619,1302],{"class":700},[97,6621,4621],{"class":711},[97,6623,1634],{"class":696},[97,6625,720],{"class":700},[97,6627,6628,6630,6632],{"class":99,"line":1222},[97,6629,3382],{"class":704},[97,6631,1724],{"class":1083},[97,6633,6634],{"class":1071},"                           # 进 root shell\n",[97,6636,6637,6639,6641,6643,6645,6647,6649,6651,6653,6655],{"class":99,"line":1237},[97,6638,3382],{"class":704},[97,6640,2087],{"class":1083},[97,6642,1302],{"class":700},[97,6644,6512],{"class":711},[97,6646,4375],{"class":696},[97,6648,1311],{"class":700},[97,6650,1302],{"class":700},[97,6652,4621],{"class":711},[97,6654,1634],{"class":696},[97,6656,720],{"class":700},[14,6658,6659],{},"sudoers：",[89,6661,6663],{"className":1062,"code":6662,"language":1064,"meta":48,"style":48},"visudo\n",[74,6664,6665],{"__ignoreMap":48},[97,6666,6667],{"class":99,"line":100},[97,6668,6662],{"class":704},[89,6670,6673],{"className":6671,"code":6672,"language":215},[214],"alice ALL=(ALL:ALL) ALL\n%sudo ALL=(ALL:ALL) ALL\nalice ALL=(ALL) NOPASSWD: ALL     # 免密\n",[74,6674,6672],{"__ignoreMap":48},[28,6676,6678],{"id":6677},"十systemd","十、systemd",[89,6680,6682],{"className":1062,"code":6681,"language":1064,"meta":48,"style":48},"systemctl start\u002Fstop\u002Frestart\u002Freload\u002Fstatus \u003Csvc>\nsystemctl enable\u002Fdisable \u003Csvc>\nsystemctl is-active \u003Csvc>\nsystemctl list-units --type=service --state=running\nsystemctl daemon-reload\n\njournalctl -u \u003Csvc>\njournalctl -u \u003Csvc> -f\njournalctl -u \u003Csvc> --since \"1 hour ago\"\njournalctl -xe                    # 最近错误\njournalctl -b                     # 本次启动\njournalctl --disk-usage\njournalctl --vacuum-size=500M     # 清理\n",[74,6683,6684,6701,6716,6731,6744,6750,6754,6769,6786,6806,6816,6825,6832],{"__ignoreMap":48},[97,6685,6686,6689,6692,6694,6697,6699],{"class":99,"line":100},[97,6687,6688],{"class":704},"systemctl",[97,6690,6691],{"class":711}," start\u002Fstop\u002Frestart\u002Freload\u002Fstatus",[97,6693,1302],{"class":700},[97,6695,6696],{"class":711},"sv",[97,6698,4395],{"class":696},[97,6700,720],{"class":700},[97,6702,6703,6705,6708,6710,6712,6714],{"class":99,"line":49},[97,6704,6688],{"class":704},[97,6706,6707],{"class":711}," enable\u002Fdisable",[97,6709,1302],{"class":700},[97,6711,6696],{"class":711},[97,6713,4395],{"class":696},[97,6715,720],{"class":700},[97,6717,6718,6720,6723,6725,6727,6729],{"class":99,"line":111},[97,6719,6688],{"class":704},[97,6721,6722],{"class":711}," is-active",[97,6724,1302],{"class":700},[97,6726,6696],{"class":711},[97,6728,4395],{"class":696},[97,6730,720],{"class":700},[97,6732,6733,6735,6738,6741],{"class":99,"line":196},[97,6734,6688],{"class":704},[97,6736,6737],{"class":711}," list-units",[97,6739,6740],{"class":1083}," --type=service",[97,6742,6743],{"class":1083}," --state=running\n",[97,6745,6746,6748],{"class":99,"line":202},[97,6747,6688],{"class":704},[97,6749,4099],{"class":711},[97,6751,6752],{"class":99,"line":343},[97,6753,108],{"emptyLinePlaceholder":57},[97,6755,6756,6759,6761,6763,6765,6767],{"class":99,"line":349},[97,6757,6758],{"class":704},"journalctl",[97,6760,2087],{"class":1083},[97,6762,1302],{"class":700},[97,6764,6696],{"class":711},[97,6766,4395],{"class":696},[97,6768,720],{"class":700},[97,6770,6771,6773,6775,6777,6779,6781,6783],{"class":99,"line":1134},[97,6772,6758],{"class":704},[97,6774,2087],{"class":1083},[97,6776,1302],{"class":700},[97,6778,6696],{"class":711},[97,6780,4395],{"class":696},[97,6782,1311],{"class":700},[97,6784,6785],{"class":1083}," -f\n",[97,6787,6788,6790,6792,6794,6796,6798,6800,6803],{"class":99,"line":1140},[97,6789,6758],{"class":704},[97,6791,2087],{"class":1083},[97,6793,1302],{"class":700},[97,6795,6696],{"class":711},[97,6797,4395],{"class":696},[97,6799,1311],{"class":700},[97,6801,6802],{"class":1083}," --since",[97,6804,6805],{"class":711}," \"1 hour ago\"\n",[97,6807,6808,6810,6813],{"class":99,"line":1155},[97,6809,6758],{"class":704},[97,6811,6812],{"class":1083}," -xe",[97,6814,6815],{"class":1071},"                    # 最近错误\n",[97,6817,6818,6820,6822],{"class":99,"line":1160},[97,6819,6758],{"class":704},[97,6821,1567],{"class":1083},[97,6823,6824],{"class":1071},"                     # 本次启动\n",[97,6826,6827,6829],{"class":99,"line":1166},[97,6828,6758],{"class":704},[97,6830,6831],{"class":1083}," --disk-usage\n",[97,6833,6834,6836,6839],{"class":99,"line":1181},[97,6835,6758],{"class":704},[97,6837,6838],{"class":1083}," --vacuum-size=500M",[97,6840,6841],{"class":1071},"     # 清理\n",[14,6843,6844,6845,3439],{},"unit 文件示例 ",[74,6846,6847],{},"\u002Fetc\u002Fsystemd\u002Fsystem\u002Fmyapp.service",[89,6849,6853],{"className":6850,"code":6851,"language":6852,"meta":48,"style":48},"language-ini shiki shiki-themes monokai","[Unit]\nDescription=My App\nAfter=network.target\n\n[Service]\nType=simple\nUser=appuser\nWorkingDirectory=\u002Fopt\u002Fmyapp\nExecStart=\u002Fusr\u002Fbin\u002Fnode \u002Fopt\u002Fmyapp\u002Findex.js\nRestart=on-failure\nRestartSec=5\n\n[Install]\nWantedBy=multi-user.target\n","ini",[74,6854,6855,6860,6865,6870,6874,6879,6884,6889,6894,6899,6904,6909,6913,6918],{"__ignoreMap":48},[97,6856,6857],{"class":99,"line":100},[97,6858,6859],{},"[Unit]\n",[97,6861,6862],{"class":99,"line":49},[97,6863,6864],{},"Description=My App\n",[97,6866,6867],{"class":99,"line":111},[97,6868,6869],{},"After=network.target\n",[97,6871,6872],{"class":99,"line":196},[97,6873,108],{"emptyLinePlaceholder":57},[97,6875,6876],{"class":99,"line":202},[97,6877,6878],{},"[Service]\n",[97,6880,6881],{"class":99,"line":343},[97,6882,6883],{},"Type=simple\n",[97,6885,6886],{"class":99,"line":349},[97,6887,6888],{},"User=appuser\n",[97,6890,6891],{"class":99,"line":1134},[97,6892,6893],{},"WorkingDirectory=\u002Fopt\u002Fmyapp\n",[97,6895,6896],{"class":99,"line":1140},[97,6897,6898],{},"ExecStart=\u002Fusr\u002Fbin\u002Fnode \u002Fopt\u002Fmyapp\u002Findex.js\n",[97,6900,6901],{"class":99,"line":1155},[97,6902,6903],{},"Restart=on-failure\n",[97,6905,6906],{"class":99,"line":1160},[97,6907,6908],{},"RestartSec=5\n",[97,6910,6911],{"class":99,"line":1166},[97,6912,108],{"emptyLinePlaceholder":57},[97,6914,6915],{"class":99,"line":1181},[97,6916,6917],{},"[Install]\n",[97,6919,6920],{"class":99,"line":1186},[97,6921,6922],{},"WantedBy=multi-user.target\n",[89,6924,6926],{"className":1062,"code":6925,"language":1064,"meta":48,"style":48},"sudo systemctl daemon-reload\nsudo systemctl enable --now myapp\n",[74,6927,6928,6936],{"__ignoreMap":48},[97,6929,6930,6932,6934],{"class":99,"line":100},[97,6931,3382],{"class":704},[97,6933,4096],{"class":711},[97,6935,4099],{"class":711},[97,6937,6938,6940,6942,6945,6948],{"class":99,"line":49},[97,6939,3382],{"class":704},[97,6941,4096],{"class":711},[97,6943,6944],{"class":711}," enable",[97,6946,6947],{"class":1083}," --now",[97,6949,6950],{"class":711}," myapp\n",[28,6952,6954],{"id":6953},"十一ssh","十一、SSH",[89,6956,6958],{"className":1062,"code":6957,"language":1064,"meta":48,"style":48},"ssh user@host\nssh -p 2222 user@host\nssh -i ~\u002F.ssh\u002Fid_rsa user@host\n\nssh-keygen -t ed25519 -C \"comment\"\nssh-copy-id user@host\n\nssh -L 8080:localhost:80 user@host   # 本地转发\nssh -R 8080:localhost:80 user@host   # 远程转发\nssh -D 1080 user@host                # SOCKS 代理\n",[74,6959,6960,6968,6979,6990,6994,7010,7017,7021,7036,7049],{"__ignoreMap":48},[97,6961,6962,6965],{"class":99,"line":100},[97,6963,6964],{"class":704},"ssh",[97,6966,6967],{"class":711}," user@host\n",[97,6969,6970,6972,6974,6977],{"class":99,"line":49},[97,6971,6964],{"class":704},[97,6973,2505],{"class":1083},[97,6975,6976],{"class":1083}," 2222",[97,6978,6967],{"class":711},[97,6980,6981,6983,6985,6988],{"class":99,"line":111},[97,6982,6964],{"class":704},[97,6984,1724],{"class":1083},[97,6986,6987],{"class":711}," ~\u002F.ssh\u002Fid_rsa",[97,6989,6967],{"class":711},[97,6991,6992],{"class":99,"line":196},[97,6993,108],{"emptyLinePlaceholder":57},[97,6995,6996,6999,7002,7005,7007],{"class":99,"line":202},[97,6997,6998],{"class":704},"ssh-keygen",[97,7000,7001],{"class":1083}," -t",[97,7003,7004],{"class":711}," ed25519",[97,7006,6335],{"class":1083},[97,7008,7009],{"class":711}," \"comment\"\n",[97,7011,7012,7015],{"class":99,"line":343},[97,7013,7014],{"class":704},"ssh-copy-id",[97,7016,6967],{"class":711},[97,7018,7019],{"class":99,"line":349},[97,7020,108],{"emptyLinePlaceholder":57},[97,7022,7023,7025,7027,7030,7033],{"class":99,"line":1134},[97,7024,6964],{"class":704},[97,7026,6053],{"class":1083},[97,7028,7029],{"class":711}," 8080:localhost:80",[97,7031,7032],{"class":711}," user@host",[97,7034,7035],{"class":1071},"   # 本地转发\n",[97,7037,7038,7040,7042,7044,7046],{"class":99,"line":1140},[97,7039,6964],{"class":704},[97,7041,5159],{"class":1083},[97,7043,7029],{"class":711},[97,7045,7032],{"class":711},[97,7047,7048],{"class":1071},"   # 远程转发\n",[97,7050,7051,7053,7055,7058,7060],{"class":99,"line":1155},[97,7052,6964],{"class":704},[97,7054,1607],{"class":1083},[97,7056,7057],{"class":1083}," 1080",[97,7059,7032],{"class":711},[97,7061,7062],{"class":1071},"                # SOCKS 代理\n",[14,7064,7065,3439],{},[74,7066,7067],{},"~\u002F.ssh\u002Fconfig",[89,7069,7072],{"className":7070,"code":7071,"language":215},[214],"Host myserver\n    HostName 1.2.3.4\n    User alice\n    Port 2222\n    IdentityFile ~\u002F.ssh\u002Fid_ed25519\n",[74,7073,7071],{"__ignoreMap":48},[14,7075,7076,7077,2831],{},"之后 ",[74,7078,7079],{},"ssh myserver",[1390,7081,7082],{"id":7082},"传输",[89,7084,7086],{"className":1062,"code":7085,"language":1064,"meta":48,"style":48},"scp \u003Cfile> user@host:\u002Fpath\u002F\nscp user@host:\u002Fpath\u002F\u003Cfile> .\nscp -r \u003Cdir> user@host:\u002Fpath\u002F\n\nrsync -avz --progress \u003Csrc> user@host:\u003Cdst>   # 增量同步\nrsync -avz --delete \u003Csrc> user@host:\u003Cdst>\n",[74,7087,7088,7104,7121,7137,7141,7174],{"__ignoreMap":48},[97,7089,7090,7093,7095,7097,7099,7101],{"class":99,"line":100},[97,7091,7092],{"class":704},"scp",[97,7094,1302],{"class":700},[97,7096,1305],{"class":711},[97,7098,1308],{"class":696},[97,7100,1311],{"class":700},[97,7102,7103],{"class":711}," user@host:\u002Fpath\u002F\n",[97,7105,7106,7108,7111,7113,7115,7117,7119],{"class":99,"line":49},[97,7107,7092],{"class":704},[97,7109,7110],{"class":711}," user@host:\u002Fpath\u002F",[97,7112,697],{"class":700},[97,7114,1305],{"class":711},[97,7116,1308],{"class":696},[97,7118,1311],{"class":700},[97,7120,2893],{"class":711},[97,7122,7123,7125,7127,7129,7131,7133,7135],{"class":99,"line":111},[97,7124,7092],{"class":704},[97,7126,2887],{"class":1083},[97,7128,1302],{"class":700},[97,7130,4372],{"class":711},[97,7132,4375],{"class":696},[97,7134,1311],{"class":700},[97,7136,7103],{"class":711},[97,7138,7139],{"class":99,"line":196},[97,7140,108],{"emptyLinePlaceholder":57},[97,7142,7143,7146,7149,7152,7154,7156,7158,7160,7163,7165,7167,7169,7171],{"class":99,"line":202},[97,7144,7145],{"class":704},"rsync",[97,7147,7148],{"class":1083}," -avz",[97,7150,7151],{"class":1083}," --progress",[97,7153,1302],{"class":700},[97,7155,4392],{"class":711},[97,7157,4395],{"class":696},[97,7159,1311],{"class":700},[97,7161,7162],{"class":711}," user@host:",[97,7164,697],{"class":700},[97,7166,4402],{"class":711},[97,7168,2594],{"class":696},[97,7170,1311],{"class":700},[97,7172,7173],{"class":1071},"   # 增量同步\n",[97,7175,7176,7178,7180,7183,7185,7187,7189,7191,7193,7195,7197,7199],{"class":99,"line":343},[97,7177,7145],{"class":704},[97,7179,7148],{"class":1083},[97,7181,7182],{"class":1083}," --delete",[97,7184,1302],{"class":700},[97,7186,4392],{"class":711},[97,7188,4395],{"class":696},[97,7190,1311],{"class":700},[97,7192,7162],{"class":711},[97,7194,697],{"class":700},[97,7196,4402],{"class":711},[97,7198,2594],{"class":696},[97,7200,720],{"class":700},[28,7202,7204],{"id":7203},"十二软件包管理","十二、软件包管理",[1390,7206,7208],{"id":7207},"aptdebian-ubuntu","apt（Debian \u002F Ubuntu）",[89,7210,7212],{"className":1062,"code":7211,"language":1064,"meta":48,"style":48},"sudo apt update                   # 更新索引\nsudo apt upgrade                  # 升级\nsudo apt full-upgrade             # 含依赖变化\nsudo apt install \u003Cpkg>\nsudo apt remove \u003Cpkg>             # 保留配置\nsudo apt purge \u003Cpkg>              # 含配置\nsudo apt autoremove               # 清理无用依赖\nsudo apt search \u003Ckw>\nsudo apt show \u003Cpkg>\napt list --installed\n\nsudo dpkg -i \u003Cpkg>.deb\ndpkg -l | grep \u003Cpkg>\n",[74,7213,7214,7226,7238,7250,7266,7285,7305,7317,7334,7350,7360,7364,7384],{"__ignoreMap":48},[97,7215,7216,7218,7220,7223],{"class":99,"line":100},[97,7217,3382],{"class":704},[97,7219,3426],{"class":711},[97,7221,7222],{"class":711}," update",[97,7224,7225],{"class":1071},"                   # 更新索引\n",[97,7227,7228,7230,7232,7235],{"class":99,"line":49},[97,7229,3382],{"class":704},[97,7231,3426],{"class":711},[97,7233,7234],{"class":711}," upgrade",[97,7236,7237],{"class":1071},"                  # 升级\n",[97,7239,7240,7242,7244,7247],{"class":99,"line":111},[97,7241,3382],{"class":704},[97,7243,3426],{"class":711},[97,7245,7246],{"class":711}," full-upgrade",[97,7248,7249],{"class":1071},"             # 含依赖变化\n",[97,7251,7252,7254,7256,7258,7260,7262,7264],{"class":99,"line":196},[97,7253,3382],{"class":704},[97,7255,3426],{"class":711},[97,7257,3941],{"class":711},[97,7259,1302],{"class":700},[97,7261,3946],{"class":711},[97,7263,3949],{"class":696},[97,7265,720],{"class":700},[97,7267,7268,7270,7272,7274,7276,7278,7280,7282],{"class":99,"line":202},[97,7269,3382],{"class":704},[97,7271,3426],{"class":711},[97,7273,2245],{"class":711},[97,7275,1302],{"class":700},[97,7277,3946],{"class":711},[97,7279,3949],{"class":696},[97,7281,1311],{"class":700},[97,7283,7284],{"class":1071},"             # 保留配置\n",[97,7286,7287,7289,7291,7294,7296,7298,7300,7302],{"class":99,"line":343},[97,7288,3382],{"class":704},[97,7290,3426],{"class":711},[97,7292,7293],{"class":711}," purge",[97,7295,1302],{"class":700},[97,7297,3946],{"class":711},[97,7299,3949],{"class":696},[97,7301,1311],{"class":700},[97,7303,7304],{"class":1071},"              # 含配置\n",[97,7306,7307,7309,7311,7314],{"class":99,"line":349},[97,7308,3382],{"class":704},[97,7310,3426],{"class":711},[97,7312,7313],{"class":711}," autoremove",[97,7315,7316],{"class":1071},"               # 清理无用依赖\n",[97,7318,7319,7321,7323,7326,7328,7330,7332],{"class":99,"line":1134},[97,7320,3382],{"class":704},[97,7322,3426],{"class":711},[97,7324,7325],{"class":711}," search",[97,7327,1302],{"class":700},[97,7329,4458],{"class":711},[97,7331,1644],{"class":696},[97,7333,720],{"class":700},[97,7335,7336,7338,7340,7342,7344,7346,7348],{"class":99,"line":1140},[97,7337,3382],{"class":704},[97,7339,3426],{"class":711},[97,7341,2586],{"class":711},[97,7343,1302],{"class":700},[97,7345,3946],{"class":711},[97,7347,3949],{"class":696},[97,7349,720],{"class":700},[97,7351,7352,7355,7357],{"class":99,"line":1155},[97,7353,7354],{"class":704},"apt",[97,7356,2099],{"class":711},[97,7358,7359],{"class":1083}," --installed\n",[97,7361,7362],{"class":99,"line":1160},[97,7363,108],{"emptyLinePlaceholder":57},[97,7365,7366,7368,7371,7373,7375,7377,7379,7381],{"class":99,"line":1166},[97,7367,3382],{"class":704},[97,7369,7370],{"class":711}," dpkg",[97,7372,1724],{"class":1083},[97,7374,1302],{"class":700},[97,7376,3946],{"class":711},[97,7378,3949],{"class":696},[97,7380,1311],{"class":700},[97,7382,7383],{"class":711},".deb\n",[97,7385,7386,7389,7391,7393,7395,7397,7399,7401],{"class":99,"line":1181},[97,7387,7388],{"class":704},"dpkg",[97,7390,5023],{"class":1083},[97,7392,4122],{"class":700},[97,7394,4125],{"class":704},[97,7396,1302],{"class":700},[97,7398,3946],{"class":711},[97,7400,3949],{"class":696},[97,7402,720],{"class":700},[1390,7404,7406],{"id":7405},"yum-dnfrhel-centos","yum \u002F dnf（RHEL \u002F CentOS）",[89,7408,7410],{"className":1062,"code":7409,"language":1064,"meta":48,"style":48},"sudo yum install \u003Cpkg>\nsudo yum remove \u003Cpkg>\nsudo yum update\nsudo yum search \u003Ckw>\nsudo yum info \u003Cpkg>\nyum list installed\nyum clean all && yum makecache\n\nsudo dnf install \u003Cpkg>            # 新一代\ndnf upgrade\ndnf clean all\n\nsudo rpm -ivh \u003Cpkg>.rpm\nrpm -qa | grep \u003Cpkg>\nsudo rpm -e \u003Cpkg>\n",[74,7411,7412,7428,7444,7452,7468,7484,7494,7508,7512,7531,7539,7547,7551,7572,7592],{"__ignoreMap":48},[97,7413,7414,7416,7418,7420,7422,7424,7426],{"class":99,"line":100},[97,7415,3382],{"class":704},[97,7417,3631],{"class":711},[97,7419,3941],{"class":711},[97,7421,1302],{"class":700},[97,7423,3946],{"class":711},[97,7425,3949],{"class":696},[97,7427,720],{"class":700},[97,7429,7430,7432,7434,7436,7438,7440,7442],{"class":99,"line":49},[97,7431,3382],{"class":704},[97,7433,3631],{"class":711},[97,7435,2245],{"class":711},[97,7437,1302],{"class":700},[97,7439,3946],{"class":711},[97,7441,3949],{"class":696},[97,7443,720],{"class":700},[97,7445,7446,7448,7450],{"class":99,"line":111},[97,7447,3382],{"class":704},[97,7449,3631],{"class":711},[97,7451,3429],{"class":711},[97,7453,7454,7456,7458,7460,7462,7464,7466],{"class":99,"line":196},[97,7455,3382],{"class":704},[97,7457,3631],{"class":711},[97,7459,7325],{"class":711},[97,7461,1302],{"class":700},[97,7463,4458],{"class":711},[97,7465,1644],{"class":696},[97,7467,720],{"class":700},[97,7469,7470,7472,7474,7476,7478,7480,7482],{"class":99,"line":202},[97,7471,3382],{"class":704},[97,7473,3631],{"class":711},[97,7475,4119],{"class":711},[97,7477,1302],{"class":700},[97,7479,3946],{"class":711},[97,7481,3949],{"class":696},[97,7483,720],{"class":700},[97,7485,7486,7489,7491],{"class":99,"line":343},[97,7487,7488],{"class":704},"yum",[97,7490,2099],{"class":711},[97,7492,7493],{"class":711}," installed\n",[97,7495,7496,7498,7500,7502,7504,7506],{"class":99,"line":349},[97,7497,7488],{"class":704},[97,7499,3634],{"class":711},[97,7501,3721],{"class":711},[97,7503,3724],{"class":696},[97,7505,7488],{"class":704},[97,7507,3646],{"class":711},[97,7509,7510],{"class":99,"line":1134},[97,7511,108],{"emptyLinePlaceholder":57},[97,7513,7514,7516,7518,7520,7522,7524,7526,7528],{"class":99,"line":1140},[97,7515,3382],{"class":704},[97,7517,3716],{"class":711},[97,7519,3941],{"class":711},[97,7521,1302],{"class":700},[97,7523,3946],{"class":711},[97,7525,3949],{"class":696},[97,7527,1311],{"class":700},[97,7529,7530],{"class":1071},"            # 新一代\n",[97,7532,7533,7536],{"class":99,"line":1155},[97,7534,7535],{"class":704},"dnf",[97,7537,7538],{"class":711}," upgrade\n",[97,7540,7541,7543,7545],{"class":99,"line":1160},[97,7542,7535],{"class":704},[97,7544,3634],{"class":711},[97,7546,3637],{"class":711},[97,7548,7549],{"class":99,"line":1166},[97,7550,108],{"emptyLinePlaceholder":57},[97,7552,7553,7555,7558,7561,7563,7565,7567,7569],{"class":99,"line":1181},[97,7554,3382],{"class":704},[97,7556,7557],{"class":711}," rpm",[97,7559,7560],{"class":1083}," -ivh",[97,7562,1302],{"class":700},[97,7564,3946],{"class":711},[97,7566,3949],{"class":696},[97,7568,1311],{"class":700},[97,7570,7571],{"class":711},".rpm\n",[97,7573,7574,7577,7580,7582,7584,7586,7588,7590],{"class":99,"line":1186},[97,7575,7576],{"class":704},"rpm",[97,7578,7579],{"class":1083}," -qa",[97,7581,4122],{"class":700},[97,7583,4125],{"class":704},[97,7585,1302],{"class":700},[97,7587,3946],{"class":711},[97,7589,3949],{"class":696},[97,7591,720],{"class":700},[97,7593,7594,7596,7598,7601,7603,7605,7607],{"class":99,"line":1192},[97,7595,3382],{"class":704},[97,7597,7557],{"class":711},[97,7599,7600],{"class":1083}," -e",[97,7602,1302],{"class":700},[97,7604,3946],{"class":711},[97,7606,3949],{"class":696},[97,7608,720],{"class":700},[1390,7610,7612],{"id":7611},"pacmanarch","pacman（Arch）",[89,7614,7616],{"className":1062,"code":7615,"language":1064,"meta":48,"style":48},"sudo pacman -Syu                  # 同步并升级\nsudo pacman -S \u003Cpkg>\nsudo pacman -Rns \u003Cpkg>            # 卸载含依赖配置\npacman -Ss \u003Ckw>\npacman -Qs \u003Cpkg>\n",[74,7617,7618,7630,7646,7666,7682],{"__ignoreMap":48},[97,7619,7620,7622,7624,7627],{"class":99,"line":100},[97,7621,3382],{"class":704},[97,7623,3812],{"class":711},[97,7625,7626],{"class":1083}," -Syu",[97,7628,7629],{"class":1071},"                  # 同步并升级\n",[97,7631,7632,7634,7636,7638,7640,7642,7644],{"class":99,"line":49},[97,7633,3382],{"class":704},[97,7635,3812],{"class":711},[97,7637,2555],{"class":1083},[97,7639,1302],{"class":700},[97,7641,3946],{"class":711},[97,7643,3949],{"class":696},[97,7645,720],{"class":700},[97,7647,7648,7650,7652,7655,7657,7659,7661,7663],{"class":99,"line":111},[97,7649,3382],{"class":704},[97,7651,3812],{"class":711},[97,7653,7654],{"class":1083}," -Rns",[97,7656,1302],{"class":700},[97,7658,3946],{"class":711},[97,7660,3949],{"class":696},[97,7662,1311],{"class":700},[97,7664,7665],{"class":1071},"            # 卸载含依赖配置\n",[97,7667,7668,7671,7674,7676,7678,7680],{"class":99,"line":196},[97,7669,7670],{"class":704},"pacman",[97,7672,7673],{"class":1083}," -Ss",[97,7675,1302],{"class":700},[97,7677,4458],{"class":711},[97,7679,1644],{"class":696},[97,7681,720],{"class":700},[97,7683,7684,7686,7689,7691,7693,7695],{"class":99,"line":202},[97,7685,7670],{"class":704},[97,7687,7688],{"class":1083}," -Qs",[97,7690,1302],{"class":700},[97,7692,3946],{"class":711},[97,7694,3949],{"class":696},[97,7696,720],{"class":700},[28,7698,7700],{"id":7699},"十三日志","十三、日志",[89,7702,7704],{"className":1062,"code":7703,"language":1064,"meta":48,"style":48},"journalctl -xe\njournalctl --since today\njournalctl -p err                 # 只错误\n\ntail -f \u002Fvar\u002Flog\u002Fsyslog           # Debian\u002FUbuntu\ntail -f \u002Fvar\u002Flog\u002Fmessages         # RHEL\u002FCentOS\ntail -f \u002Fvar\u002Flog\u002Fauth.log         # 认证\ntail -f \u002Fvar\u002Flog\u002Fnginx\u002Faccess.log\ntail -f \u002Fvar\u002Flog\u002Fnginx\u002Ferror.log\n\ndmesg\ndmesg -T                          # 人类可读时间\ndmesg | tail -20\n",[74,7705,7706,7713,7722,7734,7738,7750,7762,7774,7783,7792,7796,7801,7812],{"__ignoreMap":48},[97,7707,7708,7710],{"class":99,"line":100},[97,7709,6758],{"class":704},[97,7711,7712],{"class":1083}," -xe\n",[97,7714,7715,7717,7719],{"class":99,"line":49},[97,7716,6758],{"class":704},[97,7718,6802],{"class":1083},[97,7720,7721],{"class":711}," today\n",[97,7723,7724,7726,7728,7731],{"class":99,"line":111},[97,7725,6758],{"class":704},[97,7727,2505],{"class":1083},[97,7729,7730],{"class":711}," err",[97,7732,7733],{"class":1071},"                 # 只错误\n",[97,7735,7736],{"class":99,"line":196},[97,7737,108],{"emptyLinePlaceholder":57},[97,7739,7740,7742,7744,7747],{"class":99,"line":202},[97,7741,4703],{"class":704},[97,7743,4706],{"class":1083},[97,7745,7746],{"class":711}," \u002Fvar\u002Flog\u002Fsyslog",[97,7748,7749],{"class":1071},"           # Debian\u002FUbuntu\n",[97,7751,7752,7754,7756,7759],{"class":99,"line":343},[97,7753,4703],{"class":704},[97,7755,4706],{"class":1083},[97,7757,7758],{"class":711}," \u002Fvar\u002Flog\u002Fmessages",[97,7760,7761],{"class":1071},"         # RHEL\u002FCentOS\n",[97,7763,7764,7766,7768,7771],{"class":99,"line":349},[97,7765,4703],{"class":704},[97,7767,4706],{"class":1083},[97,7769,7770],{"class":711}," \u002Fvar\u002Flog\u002Fauth.log",[97,7772,7773],{"class":1071},"         # 认证\n",[97,7775,7776,7778,7780],{"class":99,"line":1134},[97,7777,4703],{"class":704},[97,7779,4706],{"class":1083},[97,7781,7782],{"class":711}," \u002Fvar\u002Flog\u002Fnginx\u002Faccess.log\n",[97,7784,7785,7787,7789],{"class":99,"line":1140},[97,7786,4703],{"class":704},[97,7788,4706],{"class":1083},[97,7790,7791],{"class":711}," \u002Fvar\u002Flog\u002Fnginx\u002Ferror.log\n",[97,7793,7794],{"class":99,"line":1155},[97,7795,108],{"emptyLinePlaceholder":57},[97,7797,7798],{"class":99,"line":1160},[97,7799,7800],{"class":704},"dmesg\n",[97,7802,7803,7806,7809],{"class":99,"line":1166},[97,7804,7805],{"class":704},"dmesg",[97,7807,7808],{"class":1083}," -T",[97,7810,7811],{"class":1071},"                          # 人类可读时间\n",[97,7813,7814,7816,7818,7820],{"class":99,"line":1181},[97,7815,7805],{"class":704},[97,7817,4122],{"class":700},[97,7819,4693],{"class":704},[97,7821,6269],{"class":1083},[28,7823,7825],{"id":7824},"十四环境变量","十四、环境变量",[89,7827,7829],{"className":1062,"code":7828,"language":1064,"meta":48,"style":48},"env\necho $PATH\nexport FOO=bar\nunset FOO\n\n# 永久\n~\u002F.bashrc                         # bash 交互式\n~\u002F.bash_profile                   # bash 登录\n~\u002F.profile                        # 通用\n\u002Fetc\u002Fprofile                      # 全局\n\nsource ~\u002F.bashrc\n\nexport PATH=\"$HOME\u002F.local\u002Fbin:$PATH\"      # 前置\nexport PATH=\"$PATH:\u002Fopt\u002Ftools\u002Fbin\"        # 后置\n",[74,7830,7831,7836,7844,7857,7865,7869,7873,7884,7894,7904,7912,7916,7924,7928,7954],{"__ignoreMap":48},[97,7832,7833],{"class":99,"line":100},[97,7834,7835],{"class":704},"env\n",[97,7837,7838,7841],{"class":99,"line":49},[97,7839,7840],{"class":4320},"echo",[97,7842,7843],{"class":696}," $PATH\n",[97,7845,7846,7849,7852,7854],{"class":99,"line":111},[97,7847,7848],{"class":700},"export",[97,7850,7851],{"class":696}," FOO",[97,7853,708],{"class":700},[97,7855,7856],{"class":696},"bar\n",[97,7858,7859,7862],{"class":99,"line":196},[97,7860,7861],{"class":4320},"unset",[97,7863,7864],{"class":711}," FOO\n",[97,7866,7867],{"class":99,"line":202},[97,7868,108],{"emptyLinePlaceholder":57},[97,7870,7871],{"class":99,"line":343},[97,7872,3871],{"class":1071},[97,7874,7875,7878,7881],{"class":99,"line":349},[97,7876,7877],{"class":700},"~",[97,7879,7880],{"class":696},"\u002F.bashrc                         ",[97,7882,7883],{"class":1071},"# bash 交互式\n",[97,7885,7886,7888,7891],{"class":99,"line":1134},[97,7887,7877],{"class":700},[97,7889,7890],{"class":696},"\u002F.bash_profile                   ",[97,7892,7893],{"class":1071},"# bash 登录\n",[97,7895,7896,7898,7901],{"class":99,"line":1140},[97,7897,7877],{"class":700},[97,7899,7900],{"class":696},"\u002F.profile                        ",[97,7902,7903],{"class":1071},"# 通用\n",[97,7905,7906,7909],{"class":99,"line":1155},[97,7907,7908],{"class":704},"\u002Fetc\u002Fprofile",[97,7910,7911],{"class":1071},"                      # 全局\n",[97,7913,7914],{"class":99,"line":1160},[97,7915,108],{"emptyLinePlaceholder":57},[97,7917,7918,7921],{"class":99,"line":1166},[97,7919,7920],{"class":4320},"source",[97,7922,7923],{"class":711}," ~\u002F.bashrc\n",[97,7925,7926],{"class":99,"line":1181},[97,7927,108],{"emptyLinePlaceholder":57},[97,7929,7930,7932,7935,7937,7940,7943,7946,7949,7951],{"class":99,"line":1186},[97,7931,7848],{"class":700},[97,7933,7934],{"class":696}," PATH",[97,7936,708],{"class":700},[97,7938,7939],{"class":711},"\"",[97,7941,7942],{"class":696},"$HOME",[97,7944,7945],{"class":711},"\u002F.local\u002Fbin:",[97,7947,7948],{"class":696},"$PATH",[97,7950,7939],{"class":711},[97,7952,7953],{"class":1071},"      # 前置\n",[97,7955,7956,7958,7960,7962,7964,7966,7969],{"class":99,"line":1192},[97,7957,7848],{"class":700},[97,7959,7934],{"class":696},[97,7961,708],{"class":700},[97,7963,7939],{"class":711},[97,7965,7948],{"class":696},[97,7967,7968],{"class":711},":\u002Fopt\u002Ftools\u002Fbin\"",[97,7970,7971],{"class":1071},"        # 后置\n",[28,7973,7975],{"id":7974},"十五性能排查","十五、性能排查",[89,7977,7979],{"className":1062,"code":7978,"language":1064,"meta":48,"style":48},"uptime                            # 负载\ntop                               # 实时\nfree -h                           # 内存\ndf -h \u002F df -i                     # 磁盘 \u002F inode\niostat -x 1                       # IO\nsar -u 1 5                        # CPU 历史\n",[74,7980,7981,7989,7996,8004,8020,8031],{"__ignoreMap":48},[97,7982,7983,7986],{"class":99,"line":100},[97,7984,7985],{"class":704},"uptime",[97,7987,7988],{"class":1071},"                            # 负载\n",[97,7990,7991,7993],{"class":99,"line":49},[97,7992,5414],{"class":704},[97,7994,7995],{"class":1071},"                               # 实时\n",[97,7997,7998,8000,8002],{"class":99,"line":111},[97,7999,6156],{"class":704},[97,8001,6101],{"class":1083},[97,8003,6161],{"class":1071},[97,8005,8006,8008,8010,8012,8015,8017],{"class":99,"line":196},[97,8007,6098],{"class":704},[97,8009,6101],{"class":1083},[97,8011,4674],{"class":711},[97,8013,8014],{"class":711}," df",[97,8016,1724],{"class":1083},[97,8018,8019],{"class":1071},"                     # 磁盘 \u002F inode\n",[97,8021,8022,8024,8026,8028],{"class":99,"line":202},[97,8023,6174],{"class":704},[97,8025,6177],{"class":1083},[97,8027,6180],{"class":1083},[97,8029,8030],{"class":1071},"                       # IO\n",[97,8032,8033,8036,8038,8040,8042],{"class":99,"line":343},[97,8034,8035],{"class":704},"sar",[97,8037,2087],{"class":1083},[97,8039,6180],{"class":1083},[97,8041,3836],{"class":1083},[97,8043,8044],{"class":1071},"                        # CPU 历史\n",[14,8046,8047],{},"通用排查顺序：",[1631,8049,8050,8057,8063,8072,8078],{},[35,8051,8052,843,8054,8056],{},[74,8053,7985],{},[74,8055,5414],{},"：负载高不高、哪个进程占用。",[35,8058,8059,8062],{},[74,8060,8061],{},"free -h","：内存是否耗尽、是否 swap。",[35,8064,8065,843,8068,8071],{},[74,8066,8067],{},"df -h",[74,8069,8070],{},"df -i","：空间 \u002F inode 是否满。",[35,8073,8074,8077],{},[74,8075,8076],{},"iostat -x 1","：IO 是否瓶颈。",[35,8079,8080,8083],{},[74,8081,8082],{},"ss -s","：连接数是否异常。",[1390,8085,8086],{"id":8086},"定位细节",[89,8088,8090],{"className":1062,"code":8089,"language":1064,"meta":48,"style":48},"lsof -p \u003Cpid>                     # 进程打开的文件\nlsof -i :8080                     # 端口占用\nlsof \u002Fvar\u002Flog\u002Fsyslog\n\ntop -H -p \u003Cpid>                   # 线程\nps -T -p \u003Cpid>\n\ntcpdump -i eth0 -n\ntcpdump -i eth0 port 80\ntcpdump -i eth0 host 1.2.3.4\ntcpdump -i eth0 -w cap.pcap       # 存盘（Wireshark 打开）\n",[74,8091,8092,8109,8120,8127,8131,8150,8166,8170,8183,8196,8210],{"__ignoreMap":48},[97,8093,8094,8096,8098,8100,8102,8104,8106],{"class":99,"line":100},[97,8095,5668],{"class":704},[97,8097,2505],{"class":1083},[97,8099,1302],{"class":700},[97,8101,5439],{"class":711},[97,8103,1634],{"class":696},[97,8105,1311],{"class":700},[97,8107,8108],{"class":1071},"                     # 进程打开的文件\n",[97,8110,8111,8113,8115,8117],{"class":99,"line":49},[97,8112,5668],{"class":704},[97,8114,1724],{"class":1083},[97,8116,5673],{"class":711},[97,8118,8119],{"class":1071},"                     # 端口占用\n",[97,8121,8122,8124],{"class":99,"line":111},[97,8123,5668],{"class":704},[97,8125,8126],{"class":711}," \u002Fvar\u002Flog\u002Fsyslog\n",[97,8128,8129],{"class":99,"line":196},[97,8130,108],{"emptyLinePlaceholder":57},[97,8132,8133,8135,8137,8139,8141,8143,8145,8147],{"class":99,"line":202},[97,8134,5414],{"class":704},[97,8136,5819],{"class":1083},[97,8138,2505],{"class":1083},[97,8140,1302],{"class":700},[97,8142,5439],{"class":711},[97,8144,1634],{"class":696},[97,8146,1311],{"class":700},[97,8148,8149],{"class":1071},"                   # 线程\n",[97,8151,8152,8154,8156,8158,8160,8162,8164],{"class":99,"line":343},[97,8153,5365],{"class":704},[97,8155,7808],{"class":1083},[97,8157,2505],{"class":1083},[97,8159,1302],{"class":700},[97,8161,5439],{"class":711},[97,8163,1634],{"class":696},[97,8165,720],{"class":700},[97,8167,8168],{"class":99,"line":349},[97,8169,108],{"emptyLinePlaceholder":57},[97,8171,8172,8175,8177,8180],{"class":99,"line":1134},[97,8173,8174],{"class":704},"tcpdump",[97,8176,1724],{"class":1083},[97,8178,8179],{"class":711}," eth0",[97,8181,8182],{"class":1083}," -n\n",[97,8184,8185,8187,8189,8191,8194],{"class":99,"line":1140},[97,8186,8174],{"class":704},[97,8188,1724],{"class":1083},[97,8190,8179],{"class":711},[97,8192,8193],{"class":711}," port",[97,8195,5995],{"class":1083},[97,8197,8198,8200,8202,8204,8207],{"class":99,"line":1155},[97,8199,8174],{"class":704},[97,8201,1724],{"class":1083},[97,8203,8179],{"class":711},[97,8205,8206],{"class":711}," host",[97,8208,8209],{"class":1083}," 1.2.3.4\n",[97,8211,8212,8214,8216,8218,8220,8223],{"class":99,"line":1160},[97,8213,8174],{"class":704},[97,8215,1724],{"class":1083},[97,8217,8179],{"class":711},[97,8219,4157],{"class":1083},[97,8221,8222],{"class":711}," cap.pcap",[97,8224,8225],{"class":1071},"       # 存盘（Wireshark 打开）\n",[28,8227,8229],{"id":8228},"十六定时任务","十六、定时任务",[89,8231,8233],{"className":1062,"code":8232,"language":1064,"meta":48,"style":48},"crontab -e                        # 编辑\ncrontab -l                        # 列出\ncrontab -r                        # 删除\n",[74,8234,8235,8245,8254],{"__ignoreMap":48},[97,8236,8237,8240,8242],{"class":99,"line":100},[97,8238,8239],{"class":704},"crontab",[97,8241,7600],{"class":1083},[97,8243,8244],{"class":1071},"                        # 编辑\n",[97,8246,8247,8249,8251],{"class":99,"line":49},[97,8248,8239],{"class":704},[97,8250,5023],{"class":1083},[97,8252,8253],{"class":1071},"                        # 列出\n",[97,8255,8256,8258,8260],{"class":99,"line":111},[97,8257,8239],{"class":704},[97,8259,2887],{"class":1083},[97,8261,8262],{"class":1071},"                        # 删除\n",[14,8264,8265],{},"格式：",[89,8267,8270],{"className":8268,"code":8269,"language":215},[214],"* * * * * \u003Ccommand>\n│ │ │ │ │\n│ │ │ │ └─ 星期（0-7，0\u002F7 都是周日）\n│ │ │ └─── 月（1-12）\n│ │ └───── 日（1-31）\n│ └─────── 时（0-23）\n└───────── 分（0-59）\n",[74,8271,8269],{"__ignoreMap":48},[14,8273,5275],{},[89,8275,8278],{"className":8276,"code":8277,"language":215},[214],"0 3 * * * \u002Fopt\u002Fbackup.sh              # 每天 3:00\n*\u002F5 * * * * \u002Fusr\u002Fbin\u002Fcheck.sh         # 每 5 分钟\n0 9-18 * * 1-5 \u002Fopt\u002Fwork.sh           # 工作日 9-18 整点\n",[74,8279,8277],{"__ignoreMap":48},[14,8281,8282],{},"注意事项：",[32,8284,8285,8288,8294],{},[35,8286,8287],{},"PATH 与登录 shell 不同，用绝对路径。",[35,8289,8290,8291,21],{},"输出默认发邮件，重定向：",[74,8292,8293],{},">> \u002Fvar\u002Flog\u002Fjob.log 2>&1",[35,8295,8296],{},"秒级任务用 systemd timer。",[28,8298,8300],{"id":8299},"十七实用技巧","十七、实用技巧",[89,8302,8304],{"className":1062,"code":8303,"language":1064,"meta":48,"style":48},"history\nhistory | grep \u003Ckw>\nCtrl+R                            # 反向搜索历史\n!!                                # 上一条\n!$                                # 上一条最后参数\n!123                              # 历史编号 123\n\npushd \u002Fpath \u002F popd \u002F dirs -v\n\nnohup \u003Ccmd> > out.log 2>&1 &\ndisown\n\nopenssl rand -base64 16           # 随机密码\nuuidgen\nmd5sum \u003Cfile>\nsha256sum \u003Cfile>\nxxd \u003Cfile>\ntime \u003Ccmd>\n\npython3 -m http.server 8000       # 快速 HTTP 服务\n",[74,8305,8306,8311,8328,8336,8344,8355,8365,8369,8374,8378,8403,8408,8412,8429,8434,8447,8460,8473,8485,8489],{"__ignoreMap":48},[97,8307,8308],{"class":99,"line":100},[97,8309,8310],{"class":4320},"history\n",[97,8312,8313,8316,8318,8320,8322,8324,8326],{"class":99,"line":49},[97,8314,8315],{"class":4320},"history",[97,8317,4122],{"class":700},[97,8319,4125],{"class":704},[97,8321,1302],{"class":700},[97,8323,4458],{"class":711},[97,8325,1644],{"class":696},[97,8327,720],{"class":700},[97,8329,8330,8333],{"class":99,"line":111},[97,8331,8332],{"class":704},"Ctrl+R",[97,8334,8335],{"class":1071},"                            # 反向搜索历史\n",[97,8337,8338,8341],{"class":99,"line":196},[97,8339,8340],{"class":700},"!!",[97,8342,8343],{"class":1071},"                                # 上一条\n",[97,8345,8346,8349,8352],{"class":99,"line":202},[97,8347,8348],{"class":700},"!",[97,8350,8351],{"class":704},"$",[97,8353,8354],{"class":1071},"                                # 上一条最后参数\n",[97,8356,8357,8359,8362],{"class":99,"line":343},[97,8358,8348],{"class":700},[97,8360,8361],{"class":704},"123",[97,8363,8364],{"class":1071},"                              # 历史编号 123\n",[97,8366,8367],{"class":99,"line":349},[97,8368,108],{"emptyLinePlaceholder":57},[97,8370,8371],{"class":99,"line":1134},[97,8372,8373],{"class":696},"pushd \u002Fpath \u002F popd \u002F dirs -v\n",[97,8375,8376],{"class":99,"line":1140},[97,8377,108],{"emptyLinePlaceholder":57},[97,8379,8380,8383,8385,8387,8389,8391,8394,8397,8400],{"class":99,"line":1155},[97,8381,8382],{"class":704},"nohup",[97,8384,1302],{"class":700},[97,8386,4621],{"class":711},[97,8388,1634],{"class":696},[97,8390,1311],{"class":700},[97,8392,8393],{"class":700}," >",[97,8395,8396],{"class":711}," out.log",[97,8398,8399],{"class":700}," 2>&1",[97,8401,8402],{"class":696}," &\n",[97,8404,8405],{"class":99,"line":1160},[97,8406,8407],{"class":4320},"disown\n",[97,8409,8410],{"class":99,"line":1166},[97,8411,108],{"emptyLinePlaceholder":57},[97,8413,8414,8417,8420,8423,8426],{"class":99,"line":1181},[97,8415,8416],{"class":704},"openssl",[97,8418,8419],{"class":711}," rand",[97,8421,8422],{"class":1083}," -base64",[97,8424,8425],{"class":1083}," 16",[97,8427,8428],{"class":1071},"           # 随机密码\n",[97,8430,8431],{"class":99,"line":1186},[97,8432,8433],{"class":704},"uuidgen\n",[97,8435,8436,8439,8441,8443,8445],{"class":99,"line":1192},[97,8437,8438],{"class":704},"md5sum",[97,8440,1302],{"class":700},[97,8442,1305],{"class":711},[97,8444,1308],{"class":696},[97,8446,720],{"class":700},[97,8448,8449,8452,8454,8456,8458],{"class":99,"line":1207},[97,8450,8451],{"class":704},"sha256sum",[97,8453,1302],{"class":700},[97,8455,1305],{"class":711},[97,8457,1308],{"class":696},[97,8459,720],{"class":700},[97,8461,8462,8465,8467,8469,8471],{"class":99,"line":1222},[97,8463,8464],{"class":704},"xxd",[97,8466,1302],{"class":700},[97,8468,1305],{"class":711},[97,8470,1308],{"class":696},[97,8472,720],{"class":700},[97,8474,8475,8478,8480,8483],{"class":99,"line":1237},[97,8476,8477],{"class":700},"time",[97,8479,1302],{"class":700},[97,8481,8482],{"class":696},"cmd",[97,8484,720],{"class":700},[97,8486,8487],{"class":99,"line":1252},[97,8488,108],{"emptyLinePlaceholder":57},[97,8490,8491,8494,8496,8499,8502],{"class":99,"line":1257},[97,8492,8493],{"class":704},"python3",[97,8495,1348],{"class":1083},[97,8497,8498],{"class":711}," http.server",[97,8500,8501],{"class":1083}," 8000",[97,8503,8504],{"class":1071},"       # 快速 HTTP 服务\n",[1390,8506,8507],{"id":8507},"命令组合",[89,8509,8511],{"className":1062,"code":8510,"language":1064,"meta":48,"style":48},"cmd1 && cmd2                      # 成功才继续\ncmd1 || cmd2                      # 失败才继续\ncmd1 ; cmd2                       # 顺序\ncmd1 &                            # 后台\n(cmd1; cmd2)                      # 子 shell\n",[74,8512,8513,8526,8539,8551,8561],{"__ignoreMap":48},[97,8514,8515,8518,8520,8523],{"class":99,"line":100},[97,8516,8517],{"class":704},"cmd1",[97,8519,3724],{"class":696},[97,8521,8522],{"class":704},"cmd2",[97,8524,8525],{"class":1071},"                      # 成功才继续\n",[97,8527,8528,8530,8533,8536],{"class":99,"line":49},[97,8529,8517],{"class":704},[97,8531,8532],{"class":700}," ||",[97,8534,8535],{"class":704}," cmd2",[97,8537,8538],{"class":1071},"                      # 失败才继续\n",[97,8540,8541,8543,8546,8548],{"class":99,"line":111},[97,8542,8517],{"class":704},[97,8544,8545],{"class":696}," ; ",[97,8547,8522],{"class":704},[97,8549,8550],{"class":1071},"                       # 顺序\n",[97,8552,8553,8555,8558],{"class":99,"line":196},[97,8554,8517],{"class":704},[97,8556,8557],{"class":696}," &                            ",[97,8559,8560],{"class":1071},"# 后台\n",[97,8562,8563,8566,8568,8571,8573,8576],{"class":99,"line":202},[97,8564,8565],{"class":696},"(",[97,8567,8517],{"class":704},[97,8569,8570],{"class":696},"; ",[97,8572,8522],{"class":704},[97,8574,8575],{"class":696},")                      ",[97,8577,8578],{"class":1071},"# 子 shell\n",[1390,8580,8581],{"id":8581},"变量",[89,8583,8585],{"className":1062,"code":8584,"language":1064,"meta":48,"style":48},"name=\"world\"\necho \"$name\"\necho \"${name}\"\necho \"$(date)\"\necho '$name'                      # 不替换\n\n: ${VAR:=default}                 # 默认值\n\nstr=\"hello.txt\"\n\n{% raw %}\necho ${str%.txt}                  # hello\necho ${str#hello.}                # txt\necho ${str\u002Ftxt\u002Fmd}                # hello.md\necho ${#str}                      # 9\n{% endraw %}\n\n",[74,8586,8587,8597,8610,8622,8635,8645,8649,8666,8670,8680,8684,8698,8713,8728,8747,8762],{"__ignoreMap":48},[97,8588,8589,8592,8594],{"class":99,"line":100},[97,8590,8591],{"class":696},"name",[97,8593,708],{"class":700},[97,8595,8596],{"class":711},"\"world\"\n",[97,8598,8599,8601,8604,8607],{"class":99,"line":49},[97,8600,7840],{"class":4320},[97,8602,8603],{"class":711}," \"",[97,8605,8606],{"class":696},"$name",[97,8608,8609],{"class":711},"\"\n",[97,8611,8612,8614,8617,8619],{"class":99,"line":111},[97,8613,7840],{"class":4320},[97,8615,8616],{"class":711}," \"${",[97,8618,8591],{"class":696},[97,8620,8621],{"class":711},"}\"\n",[97,8623,8624,8626,8629,8632],{"class":99,"line":196},[97,8625,7840],{"class":4320},[97,8627,8628],{"class":711}," \"$(",[97,8630,8631],{"class":704},"date",[97,8633,8634],{"class":711},")\"\n",[97,8636,8637,8639,8642],{"class":99,"line":202},[97,8638,7840],{"class":4320},[97,8640,8641],{"class":711}," '$name'",[97,8643,8644],{"class":1071},"                      # 不替换\n",[97,8646,8647],{"class":99,"line":343},[97,8648,108],{"emptyLinePlaceholder":57},[97,8650,8651,8654,8657,8660,8663],{"class":99,"line":349},[97,8652,8653],{"class":4320},":",[97,8655,8656],{"class":696}," ${VAR",[97,8658,8659],{"class":700},":=",[97,8661,8662],{"class":696},"default}                 ",[97,8664,8665],{"class":1071},"# 默认值\n",[97,8667,8668],{"class":99,"line":1134},[97,8669,108],{"emptyLinePlaceholder":57},[97,8671,8672,8675,8677],{"class":99,"line":1140},[97,8673,8674],{"class":696},"str",[97,8676,708],{"class":700},[97,8678,8679],{"class":711},"\"hello.txt\"\n",[97,8681,8682],{"class":99,"line":1155},[97,8683,108],{"emptyLinePlaceholder":57},[97,8685,8686,8689,8692,8695],{"class":99,"line":1160},[97,8687,8688],{"class":696},"{",[97,8690,8691],{"class":704},"%",[97,8693,8694],{"class":711}," raw",[97,8696,8697],{"class":711}," %}\n",[97,8699,8700,8702,8705,8707,8710],{"class":99,"line":1166},[97,8701,7840],{"class":4320},[97,8703,8704],{"class":696}," ${str",[97,8706,8691],{"class":700},[97,8708,8709],{"class":696},".txt}                  ",[97,8711,8712],{"class":1071},"# hello\n",[97,8714,8715,8717,8719,8722,8725],{"class":99,"line":1181},[97,8716,7840],{"class":4320},[97,8718,8704],{"class":696},[97,8720,8721],{"class":700},"#",[97,8723,8724],{"class":696},"hello.}                ",[97,8726,8727],{"class":1071},"# txt\n",[97,8729,8730,8732,8734,8736,8739,8741,8744],{"class":99,"line":1186},[97,8731,7840],{"class":4320},[97,8733,8704],{"class":696},[97,8735,5099],{"class":700},[97,8737,8738],{"class":696},"txt",[97,8740,5099],{"class":700},[97,8742,8743],{"class":696},"md}                ",[97,8745,8746],{"class":1071},"# hello.md\n",[97,8748,8749,8751,8754,8756,8759],{"class":99,"line":1192},[97,8750,7840],{"class":4320},[97,8752,8753],{"class":696}," ${",[97,8755,8721],{"class":700},[97,8757,8758],{"class":696},"str}                      ",[97,8760,8761],{"class":1071},"# 9\n",[97,8763,8764,8766,8768,8771],{"class":99,"line":1207},[97,8765,8688],{"class":696},[97,8767,8691],{"class":704},[97,8769,8770],{"class":711}," endraw",[97,8772,8697],{"class":711},[28,8774,8776],{"id":8775},"十八快捷键","十八、快捷键",[356,8778,8779,8789],{},[359,8780,8781],{},[362,8782,8783,8786],{},[365,8784,8785],{},"快捷键",[365,8787,8788],{},"作用",[375,8790,8791,8800,8810,8820,8833,8846,8856,8865,8874],{},[362,8792,8793,8797],{},[380,8794,8795],{},[74,8796,5593],{},[380,8798,8799],{},"中断",[362,8801,8802,8807],{},[380,8803,8804],{},[74,8805,8806],{},"Ctrl+D",[380,8808,8809],{},"退出 shell",[362,8811,8812,8817],{},[380,8813,8814],{},[74,8815,8816],{},"Ctrl+L",[380,8818,8819],{},"清屏",[362,8821,8822,8830],{},[380,8823,8824,423,8827],{},[74,8825,8826],{},"Ctrl+A",[74,8828,8829],{},"Ctrl+E",[380,8831,8832],{},"行首 \u002F 行尾",[362,8834,8835,8843],{},[380,8836,8837,423,8840],{},[74,8838,8839],{},"Ctrl+U",[74,8841,8842],{},"Ctrl+K",[380,8844,8845],{},"删光标前 \u002F 后",[362,8847,8848,8853],{},[380,8849,8850],{},[74,8851,8852],{},"Ctrl+W",[380,8854,8855],{},"删前一个单词",[362,8857,8858,8862],{},[380,8859,8860],{},[74,8861,8332],{},[380,8863,8864],{},"搜索历史",[362,8866,8867,8871],{},[380,8868,8869],{},[74,8870,5536],{},[380,8872,8873],{},"挂起",[362,8875,8876,8884],{},[380,8877,8878,423,8881],{},[74,8879,8880],{},"Tab",[74,8882,8883],{},"Tab Tab",[380,8885,8886],{},"补全 \u002F 列候选",[959,8888],{},[28,8890,3285],{"id":3285},[32,8892,8893,8900,8907,8914,8921,8927],{},[35,8894,8895,8896],{},"清华镜像站：",[972,8897,8898],{"href":8898,"rel":8899,"target":975},"https:\u002F\u002Fmirrors.tuna.tsinghua.edu.cn\u002F",[3295,977,3296],[35,8901,8902,8903],{},"中科大镜像站：",[972,8904,8905],{"href":8905,"rel":8906,"target":975},"https:\u002F\u002Fmirrors.ustc.edu.cn\u002F",[3295,977,3296],[35,8908,8909,8910],{},"阿里云镜像站：",[972,8911,8912],{"href":8912,"rel":8913,"target":975},"https:\u002F\u002Fdeveloper.aliyun.com\u002Fmirror\u002F",[3295,977,3296],[35,8915,8916,8917],{},"npmmirror：",[972,8918,8919],{"href":8919,"rel":8920,"target":975},"https:\u002F\u002Fnpmmirror.com\u002F",[3295,977,3296],[35,8922,8923,8924],{},"man 手册：",[74,8925,8926],{},"man \u003Ccommand>",[35,8928,8929,8930,8933],{},"tldr：",[74,8931,8932],{},"tldr \u003Ccommand>","（需安装）",[558,8935,8936],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sHkqI, html code.shiki .sHkqI{--shiki-default:#A6E22E}html pre.shiki code .s_Ekj, html code.shiki .s_Ekj{--shiki-default:#E6DB74}html pre.shiki code .s7s5_, html code.shiki .s7s5_{--shiki-default:#AE81FF}html pre.shiki code .snpHw, html code.shiki .snpHw{--shiki-default:#88846F}html pre.shiki code .szGx7, html code.shiki .szGx7{--shiki-default:#FD971F}html pre.shiki code .sCdxs, html code.shiki .sCdxs{--shiki-default:#F8F8F2}html pre.shiki code .s8I7P, html code.shiki .s8I7P{--shiki-default:#F92672}html pre.shiki code .sOx1s, html code.shiki .sOx1s{--shiki-default:#66D9EF;--shiki-default-font-style:italic}html pre.shiki code .susgL, html code.shiki .susgL{--shiki-default:#CFCFC2}html pre.shiki code .sYf5A, html code.shiki .sYf5A{--shiki-default:#66D9EF}",{"title":48,"searchDepth":49,"depth":49,"links":8938},[8939,8950,8953,8956,8957,8958,8961,8962,8963,8964,8965,8968,8973,8974,8975,8978,8979,8983,8984],{"id":3364,"depth":49,"text":3365,"children":8940},[8941,8942,8943,8944,8945,8946,8947,8948,8949],{"id":3368,"depth":111,"text":3369},{"id":3475,"depth":111,"text":3476},{"id":3543,"depth":111,"text":3544},{"id":3783,"depth":111,"text":3784},{"id":3860,"depth":111,"text":3861},{"id":4019,"depth":111,"text":4020},{"id":4140,"depth":111,"text":4141},{"id":4174,"depth":111,"text":4175},{"id":4225,"depth":111,"text":4226},{"id":4309,"depth":49,"text":4310,"children":8951},[8952],{"id":4505,"depth":111,"text":4505},{"id":4660,"depth":49,"text":4661,"children":8954},[8955],{"id":5045,"depth":111,"text":5045},{"id":5115,"depth":49,"text":5116},{"id":5354,"depth":49,"text":5355},{"id":5618,"depth":49,"text":5619,"children":8959},[8960],{"id":5947,"depth":111,"text":5947},{"id":6087,"depth":49,"text":6088},{"id":6272,"depth":49,"text":6273},{"id":6460,"depth":49,"text":6461},{"id":6677,"depth":49,"text":6678},{"id":6953,"depth":49,"text":6954,"children":8966},[8967],{"id":7082,"depth":111,"text":7082},{"id":7203,"depth":49,"text":7204,"children":8969},[8970,8971,8972],{"id":7207,"depth":111,"text":7208},{"id":7405,"depth":111,"text":7406},{"id":7611,"depth":111,"text":7612},{"id":7699,"depth":49,"text":7700},{"id":7824,"depth":49,"text":7825},{"id":7974,"depth":49,"text":7975,"children":8976},[8977],{"id":8086,"depth":111,"text":8086},{"id":8228,"depth":49,"text":8229},{"id":8299,"depth":49,"text":8300,"children":8980},[8981,8982],{"id":8507,"depth":111,"text":8507},{"id":8581,"depth":111,"text":8581},{"id":8775,"depth":49,"text":8776},{"id":3285,"depth":49,"text":3285},{},"\u002Flinux-memo-2026-09-25",{"title":3356,"description":3361},"linux-memo-2026-09-25",[8990,8991,3352],"linux","运维","iSEC1Y6u5VxuDGnkptYIp294v_f2HDDTd_aIwN64dAg",1794733995490]