Não existe algo como “enviar EOF”. O fim do arquivo é atingido quando não há mais dados para ler.
No primeiro trecho, assim que o script Python sair, não haverá mais processo que tenha o canal aberto para gravação. Portanto, uma vez que foo
tenha terminado de ler todos os dados que foram enviados no pipe, ele detecta uma condição de fim de arquivo em sua entrada padrão.
No segundo trecho, assim que o script Python sai, o pipe ainda é aberto pela subshell. Portanto, mesmo se foo
terminar de ler todos os dados produzidos pelo script Python, ele continuará esperando por mais entradas. O subshell lança cat
, que lê e encaminha dados de sua própria entrada padrão. Quando cat
sai, a situação é a mesma de antes: não há mais processo que tenha o canal aberto para gravação e foo
atingirá o final de sua entrada.
Quando um processo é bloqueado em uma chamada de sistema read
, há vários motivos pelos quais a chamada do sistema pode retornar:
- Se os dados estiverem disponíveis,
read
retornará um valor positivo e armazenará muitos bytes no buffer passados para ele. - Se o final do arquivo for atingido,
read
retornará 0. Para um arquivo normal, isso acontece quando a posição do arquivo atinge o final do arquivo. Para um pipe, isso acontece quando o último processo que tinha o arquivo aberto morre e o buffer do pipe foi totalmente consumido. - Se algum erro ocorrer,
read
retornará -1.