为什么 colordiff 不能与 stdin 一起使用?

为什么 colordiff 不能与 stdin 一起使用?

我有一个文件和一个来自管道的输入。它们是相同的。那么为什么会colordiff报告差异?:

echo "123" | colordiff <(echo "123") -
1d0
< 123

看来这是 colordiff 引起的问题。使用纯 diff,一切正常。

答案1

使用差异

这对我有用。您的特定版本似乎有问题diff

例子

$ echo "123" | diff <(echo "123") -
$

我的版本

$ diff --version
diff (GNU diffutils) 3.3
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Paul Eggert, Mike Haertel, David Hayes,
Richard Stallman, and Len Tower.

您也可以尝试这种替代形式:

$ diff <(echo "123") <(echo "123")
$

但无论哪种方式,它都应该报告它们是相同的。

那么 colordiff 怎么样?

那么这个方法表明它们是相同的。

$ colordiff <(echo "123") <(echo "123")
$

然而,正如您所指出的, usingecho实际上将这两个字符串报告为不同的:

$ echo "123" | colordiff <(echo "123") -
1d0
< 123

但要意识到这colordiff实际上只是 GNU diff 的 Perl 脚本包装器。

$ head /usr/bin/colordiff
#!/usr/bin/perl -w

########################################################################
#                                                                      #
# ColorDiff - a wrapper/replacment for 'diff' producing                #
#             colourful output                                         #
#                                                                      #
# Copyright (C)2002-2012 Dave Ewart ([email protected])              #
#                                                                      #
########################################################################

由于它是一个 Perl 脚本,您可以通过 Perl 调试器运行该脚本来查看发生了什么:

$ echo "123" | perl -d /usr/bin/colordiff <(echo "123") -

我认为这里的底线是colordiff不具备通过 STDIN ( -) 获取输入的能力,它只是设计用于从文件获取输入。

搜索发现有几个关于缺少此功能的错误:

colordiff的开发分支

我在github上找到了这个,基梅尔/科洛迪夫。我粗略地浏览了一下源代码,似乎是一个可以更好地处理 STDIN 的新版本。

有效的替代形式

您可以使用diff来生成差异,然后通过管道将输出传递到colordiff之后。

$ echo "123" | diff -u <(echo "123") - | colordiff

我在 daveewart 的分支/分支中找到了这个colordiff可以在 github 上找到。还有相当多的其他形式可以调用colordiff,也许其中一种可以满足您的需要。

相关内容