"читать" не время выключения при чтении из трубы в bash

Я создаю канал, используя

mkfifo /tmp/foo.pipe

Теперь я хочу попробовать прочитать из канала максимум 2 секунды, поэтому я выполняю

read -t 2 line < /tmp/foo.pipe

Таймаут не возникает. Читайте, просто сидит там, ожидая ввода от трубы.

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

ls -al /tmp/foo.pipe
prw-r----- 1 foo bar 0 Jun 22 19:06 /tmp/foo.pipe

Ответ 1

Ваша оболочка блокирует вызов open() перед вызовом встроенного чтения.

В Linux вы можете открыть FIFO для чтения и записи одновременно, чтобы предотвратить блокировку при открытии; это не переносится, но может делать то, что вы хотите.

read -t 2 <>/tmp/foo.pipe

Адаптировано из: Bash script с неблокируемым чтением

Ответ 2

Если вы просто хотите сбросить (и отбросить) данные из FIFO:

dd iflag=nonblock if=/tmp/foo.pipe of=/dev/null &> /dev/null

Ответ 3

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

Ответ 4

TMOUT=2
read line < /tmp/foo.pipe