我正在运行diff --brief -r /home/mateusz/ /media/mateusz/Database/backup_test_tmp_folder/home/mateusz/
以错误代码 2 完成的命令。根据文档“如果输入相同,则退出状态为 0;如果不同,则退出状态为 1;如果有问题,则退出状态为 2。”
不幸的是,命令退出时没有给出任何失败原因的线索。我尝试使用 strace,但不幸的是,我无法根据生成的日志诊断出任何问题(3.5GB strace 文件的最后 150 行发布到https://gist.github.com/matkoniecz/15ed855bd3f161ad6354c7d637234804- 并且对于 diff 运行也sudo
失败,在生成 78KB 的 strace 日志后)。
我考虑过修改 diff 命令以在死亡并返回 2 之前输出一些解释,但考虑到我的程序不太可能是唯一缺乏对此类调试的支持,这似乎表明有更好的解决方案(希望它不是“学习如何解释 strace”)。
那么我应该如何检查 diff 命令失败的原因?有没有比 strace 或向 diff 命令添加 printf 调试更好的工具?
答案1
您可以读取输出。diff
除了以下之外,没有给出不同的退出状态代码:
- 如果输入相同,则为 0,
- 如果不同则为 1,
- 2.如有麻烦。
(从人差异)
“故障”意味着它无法读取文件或其他任何东西。
通过使用 diff (GNU diffutils) 3.3 进行一些测试并比较文件夹,diff
将消息输出到 stdout 或 stderr:
如果缺少一个文件,则退出状态为1,这出现在标准输出:
Only in folder1: file-a
如果一个文件无法读取,则退出状态为2,这出现在标准错误:
diff: folder1/file-b: Permission denied
(如果两个错误都发生,退出状态为 2。)
因此,读取/解析 stdout 和 stderr 来找出问题所在。
请注意,diff 在遇到“问题”后将继续处理其他文件,因此报告退出状态 2 的原因的行可能位于输出的任何部分。
看到这个GNU“diffutils 手册”链接有关比较目录的更多信息(以及一般使用 diff 的信息,疯狂地比仅仅更详细man diff
)。信息如下:
...如果您使用
--report-identical-files
(-s
)选项,它会报告成对的相同文件如果只有一个文件存在,diff 通常不会显示其内容;它仅报告一个文件存在而另一个文件不存在。您可以让 diff 认为缺失的文件是空的,这样它就会输出实际存在的文件的全部内容……使用
--new-file
( )……如果旧目录包含新目录中没有的大文件,您可以使用选项而不是 来-N
缩小补丁大小。--unidirectional-new-file
-N
要在比较目录时忽略某些文件,请使用
--exclude=pattern
(-x pattern
)选项如果您一直在比较两个目录,但中途停止了,稍后您可能想从上次停止的地方继续。您可以使用
--starting-file=file
(-S file
) 选项执行此操作。这只会比较文件 file 和最顶层目录中所有按字母顺序排列的文件。
或者来自其他网站的相关问题: