#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
.