Linux 命令行入门学习资料 day_5
diff命令与命令行自动化比对一、为什么学diff—— 比对是调试和测试的核心在编程学习或项目开发中我们经常需要做一件事检查程序的输出是不是和预期的一样。你写了一个 C 程序运行后输出一段文本你想知道它和正确答案有没有区别。你修改了代码想确保修改后的输出和修改前完全一致回归测试。你要批改作业或自动判题需要让计算机自动比较结果。diff就是 Linux 下用来逐行比较两个文件差异的标准工具。掌握了它你就拥有了命令行自动化比对的能力。二、diff是什么—— 逐行比较的利器diff是difference的缩写。它的作用是给定两个文件找出它们有哪些行不同并以一定的格式显示出来。基本用法diff文件1 文件2如果两个文件完全相同diff不会输出任何东西静默。如果有差异它会显示哪些行需要修改才能让文件1变成文件2。三、最简单的例子两个文本文件的比较我们创建两个文件来感受一下。echoapplea.txtechobananab.txt然后比较diffa.txt b.txt输出1c1 apple --- banana解读第一行1c1表示“文件1的第1行改变cchange成文件2的第1行”。开头的是文件1的内容开头的是文件2的内容。如果改成相同内容echoappleb.txtdiffa.txt b.txt没有任何输出说明两文件完全相同。四、把程序输出“抓”出来 —— 重定向与预期结果文件自动化比对的关键一步是把程序输出保存到文件里。你之前学过运行程序用./hello但输出只是显示在屏幕上。要想让diff比较必须把它存成一个文件。方法输出重定向./hellomy_output.txt# 将标准输出保存到 my_output.txt覆盖./hellomy_output.txt# 追加到文件末尾预期结果文件你事先准备好的、正确无误的输出文件通常叫expected.txt。比如echoHello, Linux!expected.txt然后编译你的程序并运行把实际输出保存gcc hello.c-ohello ./helloactual.txt用diff比较diffexpected.txt actual.txt没有输出说明程序输出完全符合预期。如果有差异diff会打印出哪里不一样。五、自动化比对的基础diff的退出状态码在自动化脚本里我们不能用人眼去看有没有输出而要通过程序的退出码来判断是否相同。diff发现文件相同退出码为 0diff发现文件不同退出码为 1diff遇到错误如文件不存在退出码为 2查看退出码diffexpected.txt actual.txtecho$?# 显示上一条命令的退出码在 Shell 脚本里我们可以这样用ifdiffexpected.txt actual.txt/dev/null;thenecho测试通过elseecho测试失败fi /dev/null是丢弃diff的输出我们只关心退出码。六、diff常用选项详解打造你的比对工具箱1.-u—— 统一格式Unified format这是最常用、最易读的格式也是 Git 等工具使用的格式。diff-u文件1 文件2输出会显示上下文-号开头为旧文件行号开头为新文件行。示例diff-uexpected.txt actual.txt--- expected.txt 2025-01-01 12:00:00 actual.txt 2025-01-01 12:00:00 -1 1 -Hello, Linux! I can use gcc!一目了然要变成 actual.txt需要把“Hello, Linux!”替换为“I can use gcc!”。2.-c—— 上下文格式Context format类似-u但风格不同较早使用。diff-cfile1 file23.-y—— 并排显示Side by side将两个文件的内容左右并排显示中间用符号指示差异。diff-yfile1 file2|表示该行有差异表示只在左边文件存在表示只在右边文件存在适合在宽终端下快速扫视。4.-q—— 只报告是否相同Quiet不显示具体差异只根据退出码告诉你文件是否不同。diff-qfile1 file2如果相同无输出如果不同输出Files file1 and file2 differ。5.-s—— 报告相同Report identical当文件相同时给出明确消息。常与-q组合用。diff-sfile1 file2输出Files file1 and file2 are identical。6.-w—— 忽略空白差异有时程序输出多了一些空格或空行但实质没错。-w会忽略所有空白字符的差异。diff-wfile1 file27.-B—— 忽略空行差异忽略只包含空行的增删。七、自动化比对实战写一个测试脚本假设我们的 C 程序add计算两个数的和我们想自动测试多组数据。目录结构test/ ├── add.c ├── add (编译好的可执行文件) ├── test.sh (自动化测试脚本) ├── tests/ │ ├── 1.in (输入文件) │ ├── 1.out (预期输出) │ ├── 2.in │ └── 2.out测试脚本test.sh示例#!/bin/bash# 自动化测试脚本PASS0FAIL0foriin12;doechoRunning test$i..../addtests/$i.intests/$i.actualifdiff-qtests/$i.out tests/$i.actual/dev/null;thenechoTest$iPASSEDPASS$((PASS1))elseechoTest$iFAILEDechoExpected:cattests/$i.outechoGot:cattests/$i.actualFAIL$((FAIL1))fidoneechoechoResults:$PASSpassed,$FAILfailed解读 tests/$i.in将输入文件的内容重定向给程序相当于你在键盘输入。 tests/$i.actual保存实际输出。diff -q静默比较只看退出码。如果失败我们手动打印预期和实际方便调试。运行脚本chmodx test.sh ./test.sh这就实现了一个最简单的自动化判题系统。八、配合make或gcc进行全自动测试在 Makefile 里也可以集成测试目标test: add for i in 1 2; do \ ./add tests/$$i.in tests/$$i.actual; \ if diff -q tests/$$i.out tests/$$i.actual /dev/null; then \ echo Test $$i PASS; \ else \ echo Test $$i FAIL; \ fi; \ done然后执行make test即可一键编译并测试。九、练习题分层动手做基础篇创建两个文件a.txt内容为“red\ngreen\nblue”和b.txt内容为“red\nyellow\nblue”使用diff查看差异。再使用diff -u和diff -y分别查看对比输出格式。将a.txt复制为c.txt用diff a.txt c.txt验证它们相同然后观察echo $?的返回值。用diff -s a.txt c.txt查看输出理解-s的作用。进阶篇程序输出比对编写一个简单的 C 程序greet.c输出Hello, World!。编译后用./greet output.txt保存输出。手动创建expected.txt内容为Hello, World!。用diff output.txt expected.txt判断输出是否正确。故意把expected.txt内容改成Hello, Linux!再次运行diff观察差异。使用diff -w比较两个内容相同但有多余空格或空行的文件验证-w的忽略空白功能。提高篇自动化脚本承接练习4写一个check.sh脚本功能编译greet.c运行./greet output.txt用diff比较output.txt与expected.txt如果相同打印 “PASS”否则打印 “FAIL” 并显示差异用-u格式。设计一个包含多组测试数据的例子编写程序multiply读取两个整数从标准输入输出乘积。准备至少 3 组测试输入文件1.in、2.in、3.in和对应输出文件1.out、2.out、3.out。编写自动化测试脚本test_multiply.sh循环运行并报告通过/失败情况最后统计总数。十、答案与解析基础篇diff a.txt b.txt输出2c2之类的变化。diff -u会显示带-和的统一格式。diff -y左右对照中间会有|标记差异行。echo $?输出0。diff -s a.txt c.txt输出Files a.txt and c.txt are identical。进阶篇正确时diff output.txt expected.txt无输出$?为 0。改错后 diff 会显示差异。准备两个文件一个正常一个行末多了空格或中间多了空行diff -w会认为它们相同。提高篇check.sh内容参考#!/bin/bashgcc greet.c-ogreet ./greetoutput.txtifdiff-qoutput.txt expected.txt/dev/null;thenechoPASSelseechoFAILdiff-uexpected.txt output.txtfi输入输出文件示例1.in内容3 51.out内容152.in内容0 102.out内容0脚本结构与第七节的test.sh类似循环变量相应增加。十一、✅diff命令速查卡选项作用示例无默认输出差异行diff file1 file2-u统一格式最易读diff -u file1 file2-y并排显示diff -y file1 file2-q只报告是否不同不看细节diff -q file1 file2-s相同时打印消息diff -s file1 file2-w忽略空白差异diff -w file1 file2-B忽略空行差异diff -B file1 file2-r递归比较目录diff -r dir1 dir2自动化核心利用退出码0为相同1为不同在 Shell 脚本中判断。十二、学习检查清单diff的基本作用是什么如果两个文件完全相同diff会输出什么如何把程序输出保存到文件需要用到哪个符号diff -u和diff -y的输出分别有什么特点在 Shell 脚本中如何判断diff发现文件不同利用什么变量编写自动化测试脚本的一般步骤是什么编译、运行、重定向输出、比较、报告如果程序输出多了一些无害的空格使用哪个选项可以让diff忽略它们

相关新闻

多模态自主智能体与树搜索:让AI真正‘看懂’并操作网页

多模态自主智能体与树搜索:让AI真正‘看懂’并操作网页

1. 项目概述:当AI开始“看懂”网页并自主决策你有没有过这种体验:在电商网站上比价,翻了五页才找到想要的型号;在政府服务页面里反复点击“下一步”,却总卡在某个没说明白的字段;或者帮长辈填一份医保申请表…

2026/10/28 20:35:54 阅读更多 →
Node.js核心特性与五大应用场景解析

Node.js核心特性与五大应用场景解析

1. Node.js的核心定位与适用场景Node.js本质上是一个基于Chrome V8引擎的JavaScript运行时环境,它让JavaScript突破了浏览器的限制,能够在服务器端运行。这种设计带来了几个关键特性:事件驱动架构:采用单线程事件循环模型&#xf…

2026/10/28 20:36:02 阅读更多 →
嵌入式SDRAM控制器:内存防火墙与旋转引擎的深度解析

嵌入式SDRAM控制器:内存防火墙与旋转引擎的深度解析

1. 项目概述:深入嵌入式系统的“内存交通枢纽” 在智能手机、平板电脑这类我们每天都会接触的嵌入式设备里,处理器(CPU/GPU)和外部内存(SDRAM)之间的数据交换,就像一座繁忙城市的交通。处理器是…

2026/10/30 10:26:06 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/31 0:19:11 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/30 9:20:34 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/30 10:19:21 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/31 0:59:28 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/30 10:19:39 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/30 9:21:37 阅读更多 →

日新闻

周新闻

月新闻

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

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

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

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

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

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

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

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

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

2026/10/31 0:09:01 阅读更多 →