为什么 colordiff 不适用于标准输入?

Mar*_*ter 3 pipe colordiff

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

echo "123" | colordiff <(echo "123") -
1d0
< 123
Run Code Online (Sandbox Code Playgroud)

看起来这是导致问题的颜色差异。使用纯差异,一切正常。

slm*_*slm 8

使用差异

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

例子

$ echo "123" | diff <(echo "123") -
$
Run Code Online (Sandbox Code Playgroud)

我的版本

$ 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.
Run Code Online (Sandbox Code Playgroud)

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

$ diff <(echo "123") <(echo "123")
$
Run Code Online (Sandbox Code Playgroud)

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

色差呢?

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

$ colordiff <(echo "123") <(echo "123")
$
Run Code Online (Sandbox Code Playgroud)

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

$ echo "123" | colordiff <(echo "123") -
1d0
< 123
Run Code Online (Sandbox Code Playgroud)

但是要意识到这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 (davee@sungate.co.uk)              #
#                                                                      #
########################################################################
Run Code Online (Sandbox Code Playgroud)

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

$ echo "123" | perl -d /usr/bin/colordiff <(echo "123") -
Run Code Online (Sandbox Code Playgroud)

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

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

colordiff 的开发分支

我在 github 上找到了这个,kimmel/colordiff。看起来是一个较新的版本,可以更好地处理 STDIN,我粗略地看了一下源代码。

有效的替代形式

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

$ echo "123" | diff -u <(echo "123") - | colordiff
Run Code Online (Sandbox Code Playgroud)

我在 daveewart 的 fork/branch of 中找到了这个colordiff可在 github 上找到。您可以调用许多其他形式colordiff,也许其中一种可以满足您的需求。