我有一个文件和一个来自管道的输入。它们是相同的。那么为什么会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:当提供参数但作为使用 stdin 的 shell 脚本的一部分时不起作用
- 回复:[bug-diffutils] 与 stdin 比较的 BUG
- 回复:[colordiff-misc] 标准输入处理中的错误
colordiff的开发分支
我在github上找到了这个,基梅尔/科洛迪夫。我粗略地浏览了一下源代码,似乎是一个可以更好地处理 STDIN 的新版本。
有效的替代形式
您可以使用diff
来生成差异,然后通过管道将输出传递到colordiff
之后。
$ echo "123" | diff -u <(echo "123") - | colordiff
我在 daveewart 的分支/分支中找到了这个colordiff
,可以在 github 上找到。还有相当多的其他形式可以调用colordiff
,也许其中一种可以满足您的需要。