Bash как записать / прочитать в / из именованного канала без прерывания после первой отправки

#bash #pipe #mkfifo

#bash #канал #mkfifo

Вопрос:

УЧИТЫВАЯ:

Командная строка Bash (терминал 1):

  > mkfifo pipo
 > cat pipo
 

Командная строка Bash (терминал 2):

  > echo -e "Hello WorldnHi" > pipo
 

Результат:

Bash в (терминал 1) печатает:

  Hello World
 Hi
 

и прерывается.

ВОПРОС:

Как я могу добиться, чтобы он не прерывался, но позволял отправлять другое эхо pipo -сообщение?

Ответ №1:

Это потому echo ... > fifo , что открывает, а затем закрывает fifo. В качестве обходного пути вы можете сделать так:

 # open for writing
exec 20> fifo
echo foo >amp;20
echo bar >amp;20
...
# to close it
exec 20>amp;-
 

Небольшое объяснение:

  • exec 20> fifo открывается fifo для записи с помощью FD (дескриптор файла) 20.
  • command >amp;20 перенаправляет вывод на FD 20.
  • exec 20>amp;- закрывает FD 20.

Ниже приведены выдержки из man bash :

  • exec [-cl] [-имя] [команда [аргументы]]

    […] Если команда не указана, любые перенаправления вступают в силу в текущей командной оболочке, а статус возврата равен 0. Если произошла ошибка перенаправления, статус возврата равен 1.

  • [n]> word

    Перенаправление вывода приводит к тому, что файл, имя которого является результатом расширения word, открывается для записи в файловый дескриптор n или стандартный вывод (файловый дескриптор 1), если n не указано. Если файл не существует, он создается; если он существует, он обрезается до нулевого размера. […]

  • [n]>amp;word

    […] Если word вычисляет значение to - , дескриптор файла n закрывается. […]

Комментарии:

1. Не могли бы вы, пожалуйста, подробнее рассказать о решении? Что exec 20> fifo делает, например?

2. обновлен ответ. об этом довольно много. man bash для подробного документа .

3. Имеет ли дескриптор файла 20 особое значение?

4. 20 не является особенным. обычно оболочка использует только 0 (stdin), 1 (stdout) и 2 (stderr).

Ответ №2:

В терминале 1 выполните

 tail -f pipo
 

вместо cat pipo .