Desejo enviar um comando para o processo A, do processo B, por meio de um FIFO.
O comando será uma palavra ou uma frase, mas totalmente contida em uma linha terminada em "\n" - mas pode, em geral, ser um registro de várias linhas, finalizado por outro caractere.
A parte relevante do código que tentei se parece com isso:
Processo A:
$ mkfifo ff
$ read x < ff
Processo B: (de outra janela de terminal)
$ echo -n "cmd" > ff
$ echo -n " arg1" > ff
$ echo -n " arg2" > ff
...
$ echo " argN" > ff
No entanto, o que está acontecendo é que o read
retorno com o valor cmd
, mesmo que a bash
página man diga que, por padrão, lê \n
linhas terminadas, a menos que a -d delim
opção seja usada.
Então, eu tentei especificar -d delim
explicitamente,
$ read -d "\n" x < f`
e ainda o mesmo resultado.
Poderia echo -n
estar fechando o arquivo 'descriptor' do FIFO?
Estou usando o bash 4.4.x no Ubuntu 18.04.
Sim, é exatamente isso que acontece:
Os redirecionamentos só têm efeito durante o comando único em que estão configurados. A solução alternativa no lado da gravação é a) usar um bloco composto para agrupar os comandos ou b) usar
exec
para abrir um descritor de arquivo durante todo o script (ou até o fechamento).a)
(Você também pode colocar os comandos em uma função e usar o redirecionamento ao chamar a função.)
b)
Se você quiser corrigi-lo no lado da leitura, precisará fazer um loop
read
e concatenar as strings obtidas. Como você deseja explicitamente não linhas parciais e ignora as condições de fim de arquivo, não pode usar o código de saída deread
para nada útil.