Quando o manual diz "sem invocar outro programa", significa que o shell não usa execve
para executar outros programas. Quando um comando usa redirecionamento, a implementação simples é para fork
de outro processo e faz o redirecionamento apenas para esse processo, deixando os descritores de arquivo do shell pai não modificados. Isso também é o que o bash
faz com este comando, como pode ser verificado com strace
.
É possível fazer alguns truques e evitar os garfos para comandos internos, mas parece que eles não são usados neste caso.
O segundo programa não pode detectar que o primeiro programa sai, ele só pode detectar que o lado de saída do canal foi fechado (o que pode acontecer porque o programa foi encerrado ou devido a um close
regular). O lado da leitura do tubo receberá um EOF.
É comum, mas não necessário, que o primeiro programa em um pipe saia primeiro. Considere:
sleep 10 | echo done
Se o segundo programa do pipe sair antes do primeiro e o primeiro tentar gravar no pipe, ele receberá o sinal SIGPIPE
, que terminará o processo, a menos que seja capturado.
(sleep 10; echo test ) | echo done