Мне трудно понять именованные каналы.У меня есть следующий скрипт:
#!/bin/bash
function a_or_b {
echo 'func begins'
while true; do
echo 'loop begins'
read -s -n 1; echo $?
case $REPLY in
'a') return 0 ;;
'b') return 1 ;;
esac
done
echo 'func ends'
}
mkfifo pipe
a_or_b <pipe &
Теперь я ожидал, что этот скрипт будет делать:
- введите
a_or_b
и, следовательно, напечатайте func begin
- введите цикл и, следовательно, выведите
loop begins
- прочитайте EOF из stdin и, следовательно, из
pipe
(поскольку я ничего не писал в pipe
) и, следовательно, выведите 1
, поскольку $?
- не совпадает ни с одним из условий, и поэтому вернитесь к шагу 2
При запуске этого сценария, хотя я не получаю выводи мой терминал просто распечатывает следующую подсказку.
Если я перенаправлю эхо в pipe
до , вызов a_or_b
:
...
mkfifo pipe
echo 'x' > pipe
a_or_b <pipe &
... скрипт не останавливается, и я могу продолжать вводить символы (включая a
и 'b') в терминал безрезультатно.Поэтому мне нужно завершить сценарий, используя ^ C .
Если я перенаправлю echo в pipe
после вызова a_or_b
:
...
mkfifo pipe
a_or_b <pipe &
echo 'x' > pipe
... Я получаю следующий вывод:
func begins
loop begins
0
loop begins
0
loop begins
1
loop begins
1
loop begins
1
Это в основном то поведение, которое я ожидал от не повторения чего-либо до pipe
.Функция начинается, заходит в цикл, читает символы x
и \n
из echo
(что соответствует двум 0
s в выходных данных), а затем продолжает цикл навсегда, не читая никаких символов.И если я эхо a
или b
в канал, функция завершается.
Что вызывает все эти различные поведения?