bash: чтение полной записи с fifo

Я хочу отправить команду процессу A, из процесса B через FIFO.

Команда будет словом или предложением, но полностью содержится в завершающей строке “\ n”, но, как правило, может быть многострочной записью, оканчивающейся другим символом.

Соответствующая часть кода, которую я пробовал, выглядит примерно так:

Процесс А:

$ mkfifo ff $ read x < ff 

Процесс B: (из другого windows терминала)

 $ echo -n "cmd" > ff $ echo -n " arg1" > ff $ echo -n " arg2" > ff ... $ echo " argN" > ff 

Однако, что происходит, read возвращается со значением cmd , хотя страница руководства bash говорит, что по умолчанию читает \n завершенные строки, если не -d delim опция -d delim .

Итак, я попытался указать явно -d delim ,

 $ read -d "\n" x < f` 

и все тот же результат.

Может ли echo -n закрывать файловый дескриптор FIFO?

Я использую Bash 4.4.x на Ubuntu 18.04.

Да, именно так и происходит:

 $ mkfifo p $ while :; do cat p ; done > /dev/null & $ strace -etrace=open,close bash -c 'echo -n foo > p; echo bar > p' |& grep '"p"' -A1 open("p", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3 close(3) = 0 -- open("p", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3 close(3) = 0 

Перенаправления вступают в силу только в течение одной команды, на которую они настроены. Обходной путь на стороне записи состоит в том, чтобы а) использовать составной блок для группировки команд или б) использовать exec для открытия файлового дескриптора на протяжении всего сценария (или до его закрытия).

а)

 { echo -n foo; echo bar; } > p 

(Вы также можете поместить команды в функцию и использовать redirect при вызове функции.)

б)

 exec 3>p echo -n foo >&3 echo bar >&3 exec 3>&- # to explicitly close it 

Если вы хотите исправить это на стороне чтения, вам нужно будет зациклить read и объединить полученные строки. Поскольку вам явно нужны частичные не-строки и пропускаются условия конца файла, вы не можете использовать код выхода read для чего-либо полезного.