zsh может сделать это внутренне. Поместите это в Ваш .zshrc
:
zstyle ':completion:*' list-prompt ''
zstyle ':completion:*' select-prompt ''
прежде
autoload -Uz compinit
compinit
(уже добавьте последние строки если не существующий),
См. zsh документацию для деталей.
Почему не просто сделайте:
{ echo foo; echo bar;} > /tmp/p
Если Вы хотите, чтобы Ваш сценарий управления оставил канал открытым, можно сделать:
exec 3<> /tmp/p
Открытие именованного канала в режиме чтения-записи должно избежать, что, чтобы заблокироваться, если канал еще не был открыт. Это инстанцировало бы его, если бы это еще не было. Это работает над Linux, по крайней мере, но не гарантируется POSIX.
Кроме того (и портативно):
: < /tmp/p & exec 3> /tmp/p
Затем вместо того, чтобы иметь каждый процесс открывают именованный канал, можно также сделать:
cmd >&3
И в конце, Вы сделали бы:
exec 3>&-
Для закрытия конца записи для уведомления читателей, это закончено.
измените все <
s к >
s и <
s к >
s, если Вам нужна логика, чтобы быть наоборот.
Вы не можете надежно использовать кошку для чтения из именованных каналов, поскольку Вы обнаруживаете. Я имел ту же самую проблему несколько лет назад и записал PCAT для преодоления этого ограничения.
cat
здесь и Ваш pcat
может быть записан cat p 3> p
и никогда не возвращался бы.
– Stéphane Chazelas
24.03.2013, 18:19
Вы просто неправильно понимаете, как кошка работает. Выход эха заставляет кошку выйти, также. Таким образом, если Вы не можете вынудить свои записи открыть канал rw (и сохранить его открытым) затем, просто необходимо назвать кошку в цикле:
while true; do cat /tmp/p || break; done
повреждение становится активным при отмене кошки с, например, ^C.
Можно вручную держать открытой псевдозаписывающую ссылку на fifo (используя tail -f /dev/null 1>fifo
или cat fifo 3>fifo
), чтобы читающий конец fifo не закрылся после первого чтения.
# tty1
bash -c '
mkfifo fifo || exit 1
tail -f /dev/null 1>fifo &
#0<&- cat fifo 3>fifo &
#lsof -p $!
echo first > fifo
echo second > fifo
kill $!
'
# tty2
cat fifo