Eu fiz um strace
em ambos os comandos. O interessante é que quando você canaliza a saída para head
, há apenas 123 chamadas de sistema. Por outro lado, quando o pipe para a cauda, existem 245 chamadas de sistema (ou mais, quando há mais arquivos * .txt).
Caso: cabeça
Aqui estão as últimas linhas ao enviar para head
:
open("file12.txt", O_RDONLY) = 3
fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
read(3, "", 16384) = 0
write(1, "0 file12.txt\n", 13) = -1 EPIPE (Broken pipe)
--- SIGPIPE (Broken pipe) @ 0 (0) ---
+++ killed by SIGPIPE +++
Quando wc
tenta gravar a saída do 12º arquivo, recebe um erro EPIPE
. É por isso que head
saiu depois de obter a 11ª linha. Quando head
sai, wc
obtém SIGPIPE
. Como visto na saída de strace acima, wc
primeiro tenta gravar nesse pipe (onde head
não lê mais) e recebe um erro de que o pipe está quebrado.
The SIGPIPE signal is sent to a process when it attempts to write to a pipe without a process connected to the other end. -- from Wikipedia
Caso: final
Ao enviar para tail
, não há nada parecido acima. wc termina graciosamente depois de escrever toda a saída para o pipe onde tail
precisa estar conectado o tempo todo. tail
precisa de todas as linhas antes de poder imprimir as últimas 10 delas. Quando não há mais saída para ler, tail
imprime as linhas e sai normalmente também