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 ls
saída e o shell permanece ativo. Por quê? De fato, agora na janela 2, echo ls > f
nã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>f
executado, o primeiro shell fornece um prompt. (Ponto
exec <f
,bash
nã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).