diff v3.12:选项 --from-file似乎存在问题

编程语言 2026-07-09

我在OpenSUSE tumbleweed系统上使用diff v3.12和选项 --from-file 时发现了一个问题。

如果我使用命令 diff FILE1 FILE2 FILE3 --from-file OTHER-DIR/(有无尾部斜杠),只有FILE1会被比较。对于其他文件,我得到的消息是:diff: OTHER-DIR: 没有这样的文件或目录。所有文件都存在!如果从源列表中移除FILE1,只有FILE2会被比较。

在一个老系统上,这条命令工作得非常完美。我几十年来一直在使用这类命令,从来没有遇到过类似的问题。

你能确认这是一个bug吗?

一些测试代码:

# create files
mkdir -p other-dir
for f in {,other-dir/}file{1,2,3}.tmp; do echo "$f" > "$f"; done

# test
diff file{1,2,3}.tmp --from-file other-dir/
diff file{1,2,3}.tmp --to-file other-dir/

# cleanup
rm -r file{1,2,3}.tmp other-dir/

解决方案

你能确认这是一个bug吗?

简要结论: 是的,我可以复现实验中的行为,确实存在问题。

观察到的行为

我在一个与示例命令等效的场景中复现了问题,使用GNU diff 3.12版本,在Fedora 43的 WSL2上运行。FILE1OTHER_DIR/FILE1 之间的预期差异应写入标准输出,而消息 diff: OTHER-DIR/: No such file or directory 应该写入标准错误两次。

该行为与文档不一致

因为这种用法对我来说看起来有点奇怪,其他人也可能如此,我因此确认,所描述的行为确实与GNU diff 的文档不一致。手册 描述了将一个文件与目录进行比较,或反之,是是什么意思:

如果命令行指定的一个文件是目录,而另一个不是,diff将比较该目录中名称与非目录的文件。

结合对 --from-file 的文档行为,

如果给出 --from-file=file 选项,文件名的数量是任意的,file 将与命令行中每个命名的文件进行比较。

……我得出结论,命令

diff FILE1 FILE2 FILE3 --from-file OTHER-DIR/

,其中 FILE1FILE2FILE3OTHER-DIR/FILE1OTHER-DIR/FILE2OTHER-DIR/FILE3 都是现有的常规文件,是结构正确的,并且它指示 diff 执行三次文件比较:FILE1 vs OTHER_DIR/FILE1FILE2 vs OTHER_DIR/FILE2,以及 FILE3 vs OTHER_DIR/FILE3

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章