Por que o colordiff não trabalha com stdin?

3

Eu tenho um arquivo e uma entrada vindos de um pipe. Eles são idênticos. Então, por que colordiff relata as diferenças?:

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

Parece que esta é a causa do problema. Com diff puro, tudo funciona bem.

    
por Martin Vegter 20.04.2014 / 15:11

1 resposta

8

Usando diff

Isso funciona para mim. Parece ser um problema com sua versão específica de diff ?

Exemplo

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

Minha versão

$ 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.

Você também pode tentar este formulário alternativo:

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

Mas de qualquer forma, deve informar que eles são idênticos.

E o colordiff?

Bem, esse método mostra que eles são iguais.

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

No entanto, como você indicou usando echo , de fato, relata essas duas sequências como diferentes:

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

Mas perceba que colordiff é realmente apenas um wrapper de script Perl em torno do diff do GNU.

$ 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])              #
#                                                                      #
########################################################################

Como é um script Perl, você pode executar o script pelo depurador Perl para ver o que está acontecendo:

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

Acho que a linha de fundo aqui é que colordiff não está equipado para receber entrada via STDIN ( - ), ele é projetado apenas para receber entrada de arquivos.

Pesquisando, há vários bugs arquivados em relação à falta desse recurso:

Filial de desenvolvimento do colordiff

Eu encontrei isso no github, kimmel / colordiff . Parece ser uma versão mais nova que lida melhor com STDIN, em minha rápida olhada na fonte.

Formas alternativas que funcionam

Você pode usar diff para gerar as diferenças e enviar a saída para colordiff posteriormente.

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

Encontrei isso no fork / branch da daveewart de colordiff , disponível aqui no github . Há um número bastante grande de outros formulários que você pode chamar de colordiff , talvez um deles atenda às suas necessidades.

    
por 20.04.2014 / 15:21