Duas janelas, mesmo usuário, com prompts do bash. Na janela 1, digite:
$ mkfifo f; exec <f
Portanto, o bash agora está tentando ler o descritor de arquivo 0, que é mapeado para o pipe nomeado f. Na janela 2, digite:
$ echo ls > f
Agora a janela 1 imprime um sl e o shell morre. Por quê?
Próxima experiência: abra a janela-1 novamente com exec <f. Na janela 2, digite:
$ exec 3>f
$ echo ls >&3
Após a primeira linha acima, a janela 1 é ativada e imprime um prompt. Por quê? Após a segunda linha acima, a janela 1 imprime a lssaída e o shell permanece ativo. Por quê? De fato, agora na janela 2, echo ls > fnão fecha o shell da janela 1.
A resposta deve ter a ver com a existência do descritor de arquivo 3 da janela 2, referenciando o pipe nomeado ?!
exec 3>fexecutado, o primeiro shell fornece um prompt. (Ponto
exec <f,bashnão está tentando ler a partirf, é primeira tentativa de abrir -lo. Eleopen()não retornará até que haja algum processo fazendo outra abertura no modo de gravação no canal (nesse momento, o canal será instanciado e o shell lerá a entrada dele).