Именованные каналы всегда открыты для записи

Я хочу создать именованный канал, который всегда открыт для чтения и записи.

Итак, я набрал это на терминале:

mkfifo testpipe
exec 3<> testpipe

Все работает правильно. Но когда я делаю сценарий оболочки с этими командами, он создает только именованный канал. Это не делает его открытым для чтения и письма.

Кто-нибудь знает решение?

0
задан 14.05.2020, 03:48

2 ответа

Если Вы делаете исполняемый файл сценария и выполняете его как какая-либо другая программа, он выполняется в новой оболочке, таким образом, канал открыт в той оболочке, и затем он выходит, возвращаясь к Вашей интерактивной оболочке, которая не была затронута. Для имения оболочки интерпретируют сценарий вместо того, чтобы выполнить новую оболочку, чтобы сделать это, необходимо сказать текущей оболочке открывать файл и интерпретировать его содержание с помощью эти source команда. Можно также использовать ярлык ., как в . myscript.sh.

0
ответ дан 14.05.2020, 03:49

Я не могу полностью видеть то, что Вы хотите сделать, как использование его в одном или в нескольких сценариях - но у меня есть идея, что пошло не так, как надо:

мне, похоже, что Вы пытались объединить две вещи, и combibing их получил Вас в проблеме:

Запахам нравится мертвая блокировка

Открытие файл на дополнительном дескрипторе файла текущей оболочки:

$ exec 3<>file

И использование FIFO специальный файл:

$ mkfifo fifo
$ exec 3> fifo

И затем, Вы пытались использовать их способом, которые создали тупик, например, ожидая, чтобы закончить писать, в то время как Вы планируете считать данные позже - но никогда не будете добираться до сих пор.

Оба - мощные инструменты, но они хитры для использования вместе в единственном сценарии оболочки.


Примеры

Вот соответствующий раздел в качестве примера от [1 111]
Объясненные Остроты Bash, Часть III: Все о перенаправлениях .

Примечание, как thwo независимые сценарии используются в разделе 13 при работе с FIFO:

  1. Открывают файл и для записи и для чтения

    $ exec 3<>file
    

Здесь, мы используем ромбовидный оператор удара <>. Ромбовидный оператор открывает дескриптор файла и для чтения и для записи.

Так, например, если Вы делаете это:

$ echo "foo bar" > file   # write string "foo bar" to file "file".
$ exec 5<> file           # open "file" for rw and assign it fd 5.
$ read -n 3 var <&5       # read the first 3 characters from fd 5.
$ echo $var

Это произведет нечто, поскольку мы просто читаем первые 3 символа из файла.

Теперь мы можем записать некоторый материал в файл:

$ echo -n + >&5           # write "+" at 4th position.
$ exec 5>&-               # close fd 5.
$ cat file

Это произведет foo+bar, как мы записали + символ в 4-м положении в файле.

  1. Отправляют вывод от нескольких команд до файла

    $ (command1; command2) >file
    

, Эта острота использует (команды) конструкцию, которая выполняет команды подоболочка. Подоболочка является дочерним процессом, запущенным текущей оболочкой.

Поэтому, что происходит вот, команды command1 и command2, выполняются в подоболочке, и удар перенаправляет их вывод в файл.

  1. Выполняются, команды в оболочке через файл

Открывают две оболочки. В оболочке 1 делают это:

mkfifo fifo
exec < fifo

В оболочке 2 делают это:

exec 3> fifo;
echo 'echo test' >&3

[...]

1
ответ дан 14.05.2020, 03:49

Теги

Похожие вопросы