Que fd's são usados ao fazer diff (cat old) (cat new)?

1

Se eu fizer:

diff <(cat old) <(cat new)

Hoe faz isso funcionar internamente para o programa diff? E como eu faço o mesmo truque com um script bash?

    
por Karlo 06.06.2014 / 09:20

2 respostas

1

Você pode experimentar você mesmo:

echo <(echo) <(echo)

O Diff apenas lê os dois arquivos.

Se você quiser usar <(...) como parâmetro para o seu script bash, lembre-se de que não é possível "retroceder" o arquivo (ou reabrir). Então, uma vez que você leu, desapareceu. Você pode usar read para processá-lo linha por linha, você pode grep ou qualquer outra coisa. Se você precisar processá-lo mais de uma vez, salve seu conteúdo em uma variável

input=$(cat "$1"; printf x) # The "x" keeps the trailing empty lines.
input=${input%x}

ou copie-o para um arquivo temporário e leia-o repetidamente:

tmp=$(mktemp)
cat "$1" > "$tmp"
    
por 06.06.2014 / 09:36
1

Para o programa diff , não há diferença como se você digitasse diff old new . O operador <(cmd) redireciona o stdout de cmd1 para um fifo e depois passa o fifo como um argumento para diff .

Veja um exemplo:

user@host:~$ echo <(ls)
/dev/fd/63

/dev/fd/63 é o fifo contendo a saída de ls , veja cat <(ls) imprime a saída do fifo, daí a saída de ls .

Então, o programa diff é executado da mesma forma:

diff /dev/fd/63 /dev/fd/64

E ambos os fifos contêm a saída dos cmds. Por diff são arquivos.

    
por 06.06.2014 / 09:38