Bash script with non-blocking read

Bash's read embedded command has a -t parameter to set a timeout:

-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.

This should help you solve this issue.

Edit:

There are some restrictions for this solution to work as the man page indicates: This option has no effect if read is not reading input from the terminal or a pipe.

So if I create a pipe in /tmp:

mknod /tmp/pipe p

Reading directly from the pipe is not working:

$ read -t 1 </tmp/pipe  ; echo $?

Hangs forever.

$ cat /tmp/pipe | ( read -t 1 ; echo $? )
1

It is working but cat is not exiting.

A solution is to assign the pipe to a file descriptor:

$ exec 7<>/tmp/pipe

And then read from this file descriptor either using redirection:

$ read -t 1 <&7  ; echo $?
1

Or the -u option of read:

$ read -t 1 -u 7  ; echo $?
1

Just put the reading cycle into background (add & after done)?