Bash中cmp结合进程替换用法及MIPS编解码C程序批量测试咨询
cmp本身是用来对比两个文件内容的工具,但借助Bash的进程替换(<(command)语法),我们可以直接把命令的stdout当作“虚拟文件”传给cmp,完全不用先把输出写到实际文件里,非常高效。
给你几个实用的场景示例:
- 对比两个命令的输出结果:比如想验证
ls -l和ls -la(排除.和..)的输出是否一致:cmp <(ls -l) <(ls -la | grep -v '\.\.') - 对比本地文件和命令输出:比如你有一个生成配置的脚本
gen_config.sh,想确认它的输出和参考配置config_ref.txt是否匹配:cmp config_ref.txt <(./gen_config.sh) - 只关心结果是否一致,不想看差异细节?加上
-s选项,通过$?判断返回值(0表示一致,1表示不同):cmp -s <(command1) <(command2) if [ $? -eq 0 ]; then echo "输出完全一致" else echo "输出存在差异" fi
核心逻辑很简单:<(command)会让Bash创建一个临时管道(或者/dev/fd下的文件描述符),把命令的stdout导向这个“虚拟文件”,cmp就像操作普通文件一样去对比它。
既然你已经有了test.asm(参考汇编指令)和test.bin(对应正确机器码),可以分编码测试和解码测试两部分来验证你的C程序,下面是具体的实现思路:
一、测试编码功能(汇编→机器码)
目标:验证你的程序把test.asm转成的机器码,和test.bin完全一致。
用你的编码程序处理
test.asm,输出二进制文件:
假设你的编码程序叫mips_encode,运行:./mips_encode test.asm > my_encode_result.bin注意:要确保你的程序输出的字节序和
test.bin一致(MIPS默认是大端字节序,如果你的程序输出小端,结果会直接不匹配)。用cmp直接对比二进制文件:
cmp my_encode_result.bin test.bin如果没有任何输出,说明完全一致;如果有差异,cmp会告诉你第一个不同的字节位置。
想更直观看差异?把二进制转成十六进制文本再对比:
xxd test.bin > test_hex.txt xxd my_encode_result.bin > my_encode_hex.txt diff test_hex.txt my_encode_hex.txt这样能清楚看到哪一行哪一个字节不一样。
二、测试解码功能(机器码→汇编)
目标:验证你的程序把test.bin转成的汇编指令,和test.asm逻辑一致(注意先统一格式)。
用你的解码程序处理
test.bin,输出汇编文件:
假设解码程序叫mips_decode,运行:./mips_decode test.bin > my_decode_result.asm预处理汇编文件,统一格式:
test.asm可能有注释、多余空格、大小写差异,直接diff会误判。用sed清理一下:# 清理原参考文件:去掉注释、合并多余空格、去除首尾空格 sed -e '/^#/d' -e 's/[[:space:]]\+/ /g' -e 's/^[[:space:]]//' -e 's/[[:space:]]$//' test.asm > clean_test.asm # 用同样规则清理你的程序输出 sed -e '/^#/d' -e 's/[[:space:]]\+/ /g' -e 's/^[[:space:]]//' -e 's/[[:space:]]$//' my_decode_result.asm > clean_my_decode.asm对比清理后的文件:
diff clean_test.asm clean_my_decode.asm没有输出说明解码结果完全一致;有差异的话,diff会显示具体的行差异。
三、自动化测试脚本
为了方便重复测试,可以写一个bash脚本自动完成上述步骤:
#!/bin/bash # 替换成你的程序和测试文件名称 ENCODE_PROG="./mips_encode" DECODE_PROG="./mips_decode" TEST_ASM="test.asm" TEST_BIN="test.bin" # 测试编码功能 echo "=== 测试编码功能 ===" $ENCODE_PROG $TEST_ASM > my_encode.bin if cmp my_encode.bin $TEST_BIN; then echo "✅ 编码测试通过!" else echo "❌ 编码测试失败!差异如下:" xxd $TEST_BIN > test.hex xxd my_encode.bin > my_encode.hex diff test.hex my_encode.hex | head -20 # 只显示前20行差异 fi # 测试解码功能 echo -e "\n=== 测试解码功能 ===" $DECODE_PROG $TEST_BIN > my_decode.asm # 清理格式 sed -e '/^#/d' -e 's/[[:space:]]\+/ /g' -e 's/^[[:space:]]//' -e 's/[[:space:]]$//' $TEST_ASM > clean_test.asm sed -e '/^#/d' -e 's/[[:space:]]\+/ /g' -e 's/^[[:space:]]//' -e 's/[[:space:]]$//' my_decode.asm > clean_my_decode.asm if diff clean_test.asm clean_my_decode.asm; then echo "✅ 解码测试通过!" else echo "❌ 解码测试失败!差异如下:" diff clean_test.asm clean_my_decode.asm | head -20 fi # 清理临时文件 rm -f my_encode.bin my_decode.asm clean_test.asm clean_my_decode.asm test.hex my_encode.hex
保存为test_mips_prog.sh,给它加执行权限chmod +x test_mips_prog.sh,运行就能自动完成测试了。
内容的提问来源于stack exchange,提问作者Hid

