Встроенная команда чтения Bash имеет параметр -t для установки времени ожидания:
-t timeout
Cause read to time out and return failure if a complete line of input is not
read within timeout seconds. This option has no effect if read is not reading
input from the terminal or a pipe.
Это должно помочь вам решить эту проблему.
Edit:
Существуют некоторые ограничения для этого решения для работы, как указывает справочная страница: Этот параметр не действует, если чтение не считывает ввод с терминала или канала.
Так что, если я создам трубу в / tmp:
mknod /tmp/pipe p
Чтение напрямую из трубы не работает:
$ read -t 1 </tmp/pipe ; echo $?
Висит навсегда.
$ cat /tmp/pipe | ( read -t 1 ; echo $? )
1
Работает, но кот не выходит.
Решение состоит в том, чтобы назначить канал дескриптору файла:
$ exec 7<>/tmp/pipe
А затем читать из этого файлового дескриптора либо с помощью перенаправления:
$ read -t 1 <&7 ; echo $?
1
или -u
опция read
:
$ read -t 1 -u 7 ; echo $?
1