Problema com a tubulação

0

Por que não posso fazer algo como:

tail -n 5 small.txt | diff small.txt

Eu quero passar o resultado da execução do primeiro comando como segundo argumento da segunda entrada, não sozinho. Como posso fazer isso?

    
por stand alone 15.02.2018 / 09:43

3 respostas

2

Experimente tail -n 5 small.txt | diff small.txt - .

De man diff :

If a FILE is '-', read standard input.

O método - mostra como fazer corretamente o que você queria fazer. Mas o método abaixo ensina algo que facilitará sua vida:

diff small.txt <(tail -n 5 small.txt)
    
por 15.02.2018 / 09:44
5

Tente isso ...

  diff small.txt <(tail -n 5 small.txt)
    
por 15.02.2018 / 09:51
1

O motivo pelo qual você não pode escrever o pipeline da maneira sugerida é que o utilitário diff espera dois arquivos de entrada na linha de comando e não lerá por padrão seu fluxo de entrada padrão (a saída de tail ).

Você pode instruir diff para ler a entrada padrão apenas adicionando - como segundo argumento "arquivo" (ou primeiro, dependendo da ordem em que você deseja comparar os arquivos):

tail -n 5 small.txt | diff small.txt -

diff detectará o nome do arquivo - e lerá do comando tail em vez de um segundo arquivo. Esta é uma semântica implementada por alguns utilitários como diff , cat , paste , etc. mas não é universal (o shell não sabe sobre - "ser o mesmo que a entrada padrão"). / p>

Em bash e outros shells que suportam substituição de processos usando <( ... ) , pode-se instruir o shell a criar um arquivo temporário (ou FIFO) que contenha a saída de um comando em particular:

diff small.txt <( tail -n 5 small.txt )

Isso é essencialmente (mas não tecnicamente) o mesmo que

tail -n 5 small.txt >tmpfile
diff small.txt tmpfile
rm -f tmpfile
    
por 16.02.2018 / 09:16

Tags