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