diff3 em arquivos não encontra diferença:
$ grep -P '\[\[.*?\]\]' -o intro.tex | sort > A.txt
$ grep -P '\[\[.*?\]\]' -o intro.tex | sort | uniq > B.txt
$ grep '\\pnum %% \[\[' intro.tex | sed 's/\\pnum %% //' | sort > C.txt
$ diff3 A.txt B.txt C.txt | wc -l
0
diff3 em substituições de processo executando os mesmos comandos encontra uma diferença:
$ diff3 \
<(grep -P '\[\[.*?\]\]' -o intro.tex | sort) \
<(grep -P '\[\[.*?\]\]' -o intro.tex | sort | uniq) \
<(grep '\\pnum %% \[\[' intro.tex | sed 's/\\pnum %% //' | sort) | wc -l
95
Por que? Alguma ideia?
Um reprodutor mínimo:
$ echo test > a
$ diff3 a a a
$ diff3 <(cat a) <(cat a) <(cat a)
====1
1:1c
test
2:0a
3:0a
Se executarmos
diff3
sobstrace -f
:Como você pode ver ,
diff3
chamadiff
duas vezes e o terceiro arquivo é um dos operandos para ambas as invocações.Com a substituição do processo no estilo ksh
<(...)
, o arquivo é um pipe.é o mesmo que:
exceto que um fd diferente de 0 é usado.
Então, para o terceiro argumento para
diff3
, o primeirodiff
consumirá toda a entrada, o segundo não terá mais nada para ler, então o arquivo aparecerá vazio.Portanto, o terceiro argumento pelo menos não pode ser um pipe¹.
Se estiver usando
zsh
, você pode usar a=(...)
forma de substituição de processo que usa um arquivo temporário em vez de um pipe:(os 2 primeiros ainda podem ser tubos).
No seu caso:
(Também removi o supérfluo
grep
euniq
movi a-o
opção antes das não opções).Você pode até fazer alguma fatoração com:
¹ se o terceiro argumento é
-
o quediff3
interpreta como leitura stdin, então é o segundo argumento que não pode ser um pipe, pois é o que ele passa para ambas asdiff
invocações nesse caso. Você notará que o manual diz: " No máximo um desses três nomes de arquivo pode ser-
, o que dizdiff3
para ler a entrada padrão desse arquivo."