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/7/28 14:09:16 阅读更多 →
Node.js核心特性与五大应用场景解析

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

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

2026/7/26 22:42:26 阅读更多 →
嵌入式SDRAM控制器:内存防火墙与旋转引擎的深度解析

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

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

2026/7/26 8:29:13 阅读更多 →

最新新闻

FastFlix:高效视频格式转换工具的技术解析与应用

FastFlix:高效视频格式转换工具的技术解析与应用

1. FastFlix:视频格式转换的终极解决方案作为一名长期处理视频内容的创作者,我深知格式转换这个看似简单的需求背后隐藏着多少痛点。不同平台对视频格式的要求各异,原始素材的编码方式五花八门,而传统转换工具要么速度慢如蜗牛&am…

2026/7/28 20:06:02 阅读更多 →
什么影响了你的工资?方差分析告诉你

什么影响了你的工资?方差分析告诉你

看到这个标题,你可能会想影响工资的因素太多了。学历、工作经验、能力、人脉、机会、行业、地域,等等,都会影响工资,怎么确定每个因素影响了多少工资呢?别急,我们一个一个来分析。 方差分析就是研究类别型…

2026/7/28 20:06:02 阅读更多 →
三菱FX3U PLC配方程序开发与优化实践

三菱FX3U PLC配方程序开发与优化实践

1. 项目背景与需求解析去年接手了一个食品包装产线的PLC改造项目,产线需要根据16种不同规格的包装袋自动调整灌装参数。传统做法是在触摸屏上逐个修改参数,不仅效率低下还容易出错。于是决定用三菱FX3U的配方功能实现参数一键切换,这就是今天…

2026/7/28 20:06:02 阅读更多 →
算法日常・每日刷题--<哈希>1

算法日常・每日刷题--<哈希>1

1. 两数之和 - 力扣(LeetCode)1. 两数之和 - 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案,并且…

2026/7/28 20:06:02 阅读更多 →
TPIC7710 EVM实战:汽车电子驻车制动ASIC评估与开发指南

TPIC7710 EVM实战:汽车电子驻车制动ASIC评估与开发指南

1. 项目概述:从芯片到系统,电子驻车制动ASIC的实战评估在汽车电子设计领域,尤其是关乎行车安全的底盘控制系统,工程师们面临的挑战往往不是“能不能实现”,而是“如何实现得足够可靠、高效且符合严苛的行业标准”。电子…

2026/7/28 20:06:02 阅读更多 →
C#-WPF-控件-CartesianChart图表-线性3(LineSeries)-MVVM模式(封装数据绑定类)

C#-WPF-控件-CartesianChart图表-线性3(LineSeries)-MVVM模式(封装数据绑定类)

知识点:1. 数据绑定(数据绑定类 与 图形操作在同一个类中)2. X轴上显示点数(主类 中) 3. 添加随机值在图表中 (值针对Y轴值)4. 清空图表5. 图标titel显示实例图表控件绑定 SeriesCollectionA&am…

2026/7/28 20:05:01 阅读更多 →

日新闻

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:43 阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑:把几百页的财报、法规、技术手册扔给向量库,问一个具体问题,搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了,要么藏在几十条结果的最下面。语义相似≠真正相关,这个…

2026/7/28 0:00:43 阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营,从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候,每天刷半小时抖音,手动把爆款视频的口播敲进备忘录,一条2分钟的视频得花十来分钟,碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:43 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/28 12:04:22 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/28 8:29:16 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/28 5:03:42 阅读更多 →

月新闻