Redirecionar para um pipe nomeado não removerá o pipe, ele passará os dados pelo pipe ou bloqueará se nada estiver lendo do pipe.
Esta é a maneira normal de usar um pipe nomeado. Você cria e envia dados através dele.
Eu tenho este comando:
ql_receiver_lock_holder > "${my_named_pipe}"
substituirá o pipe nomeado, se já existir? É a melhor maneira de evitar sobrescrevê-lo para simplesmente usar isso:
ql_receiver_lock_holder >> "${my_named_pipe}"
> faz um modo open() in O_WRONLY|O_TRUNK , enquanto >> executa um modo open() in O_WRONLY|O_APPEND , mas para um pipe nomeado, isso não faz diferença.
3 casos diferentes a considerar:
open() (que é feito pelo shell antes que o comando seja executado) irá bloquear até que algum processo abra o arquivo para leitura. open() terá sucesso e instanciará o pipe. Em seguida, o comando será iniciado imediatamente e poderá gravar no canal onde os dados serão acumulados até que o canal fique cheio ou algum processo leia o conteúdo no outro lado. open() retornará um fd para o mesmo pipe (não instanciar um novo). Isso significa que as gravações que nosso comando fizer serão intercaladas com as de outros comandos gravados no pipe. As gravações só terão a garantia de serem atômicas se menores que PIPE_BUF (4KiB no Linux). Isso não é diferente dos canais regulares criados por pipe()
Um modo de abertura que faz a diferença é O_RDWR (leitura + gravação) que em shells você consegue com o operador <> ( 1<> para redirecionar stdout, caso contrário ele abre em fd 0 (stdin)), que em muitos sistemas nunca bloqueiam e instanciam o pipe, se ainda não estiverem instanciados.
Tags bash shell-script fifo