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