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