我如何检查 diff 命令失败的原因?

我如何检查 diff 命令失败的原因?

我正在运行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 和最顶层目录中所有按字母顺序排列的文件。

或者来自其他网站的相关问题:

相关内容