O problema é que, enquanto
exec 3<>myPipe
abre ambos os lados R e W do FIFO simultaneamente, evitando assim um deadlock,
convert rose: -resize 640x480\! png:fd:3
é um comando normal / em primeiro plano que precisa ser concluído antes que o próximo comando possa ser executado. Como está escrevendo o que provavelmente será um monte de dados para um FIFO, ele não será concluído, mas será bloqueado quando o buffer FIFO estiver cheio, bloqueando efetivamente o script.
Para evitar isso, você precisa colocar este comando em segundo plano para que o próximo processo possa drenar simultaneamente o FIFO, evitando que ele se encha.
Como mencionei no comentário, neste caso, recomendo usar canais regulares em vez de pipes nomeados:
convert rose: -resize 640x480\! png:fd:1 |
convert png:fd:0 win:
Se você estiver preocupado com o fato de suas linhas de código ficarem muito longas, crie linhas de continuação finalizando linhas com \
ou colocando novas linhas após os tokens que precisam do lado direito (como ||
, &&
, ou |
como eu fiz isso) (Eu também tendem a recuar minhas linhas de continuação para melhor legibilidade, mas isso é puramente opcional).