Eu luto para entender os efeitos do seguinte comando:
yes | tee hello | head
No meu laptop, o número de linhas em 'hello' é da ordem de 36.000, muito superior às 10 linhas exibidas na saída padrão.
Minhas perguntas são:
Quando
yes
, e, mais geralmente, um comando em um pipe, para?Por que há uma incompatibilidade entre os dois números acima. É pq
tee
não passa as linhas uma a uma para o próximo comando no pipe?
De
man 2 write
:Então os processos morrem da direita para a esquerda.
head
sai por conta própria,tee
é morto quando tenta gravar no pipeline pela primeira vez depoishead
de sair. O mesmo acontece comyes
depoistee
de morto.tee
pode gravar no pipeline até que os buffers estejam cheios. Mas ele pode gravar o quanto quiser em um arquivo. Parece que minha versão detee
grava o mesmo blocostdout
e o arquivo.head
tem 8K em seu buffer de leitura (ou seja, do kernel). Ele lê tudo, mas imprime apenas as primeiras 10 linhas porque esse é o seu trabalho.Um programa que grava em um pipe receberá um sinal SIGPIPE quando o leitor de pipe terminar e o tee(1) não terminará enquanto sua entrada padrão permanecer aberta.
O head(1) gera 10 linhas por padrão.