Em
echo 'one' > /tmp/a
O shell faz um open(O_WRONLY)
no pipe e depois gera echo
, que então faz o write("one\n")
.
O open
será bloqueado até que algum outro processo abra o canal em RD_ONLY
ou RD_WR
.
E também o open
do seu echo two
.
Então, no momento em que você faz more /tmp/a
, você tem dois processos prontos para disparar que ainda não abriram o fifo, e muito menos escreveram alguma coisa para ele. Qual desses dois será agendado assim que more
fizer o open(RD_ONLY)
ser aleatório.
Para evitar o bloqueio, você pode fazer:
exec 3<> /tmp/a
para desbloquear o pipe primeiro e, em seguida, executar seus comandos que não serão bloqueados até que o pipe esteja cheio.
Note, entretanto, que o acima funcionará no Linux, mas não em todos os Unix ou Unix-like. O comportamento ao abrir um pipe no modo de leitura e gravação não é especificado pelo POSIX.