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

我正在运行diff --brief -r /home/mateusz/ /media/mateusz/Database/backup_test_tmp_folder/home/mateusz/ command,其中包含错误代码2.根据文档“如果输入相同,退出状态为0,1如果不同,2如果有问题。“

不幸的是,命令退出而没有给出任何线索为什么它失败了。 我尝试使用straces但不幸的是我无法根据生产的日志诊断任何东西(最后150行的3.5GB strace文件发布到https://gist.github.com/matkoniecz/15ed855bd3f161ad6354c7d637234804 – 以及与sudo运行的差异产生78KB的strace log后失败了。

我考虑修改diff命令以在死亡和返回2之前输出一些解释,但鉴于我的程序不太可能缺乏对这种调试的支持似乎表明有更好的解决方案(希望它不是“学习如何解释” strace的“)。

那么我应该如何检查为什么我的diff命令失败了? 是否有比strace更好的工具或者为diff命令添加printf调试?

你可以阅读输出。 diff不提供不同的退出状态代码,除了:

  • 0如果输入相同,
  • 1如果不同,
  • 2如果有麻烦。

(来自人类差异 )

“麻烦”意味着它无法读取文件或其他任何内容。

通过使用diff(GNU diffutils)3.3和比较文件夹的一点测试, diff消息输出到stdout或stderr:

  • 如果缺少一个文件,则退出状态为1 ,这将显示在stdout上

     Only in folder1: file-a 
  • 如果一个文件不可读,则退出状态为2 ,这将显示在stderr上

     diff: folder1/file-b: Permission denied 

(如果两个错误都发生,退出状态为2.)

因此,读取/解析stdout和stderr以找出问题所在。

请注意,diff会在遇到“麻烦”后继续处理更多文件,因此报告退出状态2原因的行可能位于输出的任何部分。


有关比较目录的更多信息,请参阅此GNU“diffutils manual”链接 (并且通常使用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 )选项来完成此操作。 这仅比较文件文件和最顶层目录级别中所有按字母顺序排列的文件。

或者来自其他网站的这些相关Q:

  • 差异的错误退出值是多少?
  • Bash:在if语句中使用diff的结果