Não, é
echo test > "$tmppipe" # BTW, you've got the quotes in the wrong places
que trava. Mais precisamente, é o shell abrindo o pipe para gravação antes de executar echo
.
pipe
são mecanismos de comunicação entre processos, eles devem ser usados entre processos em execução simultaneamente . Aqui, o open(WR_ONLY)
( >
) irá bloquear até que outro processo faça um open
no modo de leitura.
echo test > "$tmppipe" &
cat < "$tmppipe"
funcionará porque echo
e cat
são executados simultaneamente.
No Linux, você pode se safar:
exec 3<> "$tmppipe"
echo test >&3
cat < "$tmppipe"
exec 3<&-
Isso funciona porque ler + escrever open
s ( <>
) em pipes não são bloqueados no Linux, e porque a test\n
output por echo
é pequena o suficiente para caber no pipe, então você pode faça a gravação e a leitura sequencialmente.
Não funcionaria para uma produção maior como:
exec 3<> "$tmppipe"
seq 100000 >&3
cat < "$tmppipe"
exec 3<&-
Porque seq
preencheria o pipe (64kiB nas versões atuais do Linux) e bloquearia até algum outro processo ler dados desse pipe, o que nunca acontecerá porque cat
não será executado até que seq
tenha terminado .
Observe que:
echo test 1<> "$tmppipe"
cat < "$tmppipe"
também não funcionaria porque a linha de comando echo
abriria o pipe, escreveria o teste e fecharia o pipe (e o sistema o destruiria, já que não há mais descritor de arquivo aberto). Portanto, a próxima linha de comando cat
tentaria instanciar um novo canal (e bloquear até que algo abra o arquivo fifo para gravação).